为了账号安全,请及时绑定邮箱和手机立即绑定

FileInputStream fileInput = new FileInputStream("E:\\xuexi\\src.txt");

FileOutputStream fileout = new FileOutputStream("E:\\xuexi\\dest2.txt");

InputStreamReader reader = new InputStreamReader(fileInput, "GBK");

OutputStreamWriter writer=new OutputStreamWriter(fileout,"UTF-8");

int c;

char[]line=new char[10*1024];

while((c=reader.read(line,0, line.length))!=-1){

writer.write(line);

System.out.println(line);

}

fileout.close();

fileInput.close();



----输出ouputstreamWriter的编码貌似对写入文件没有影响。。请老师解答。。

正在回答

6 回答

因为你定义writer的时候就将它定义成“UTF-8”编码了,所以他就转换成这个编码输出了。看似没影响,其实这儿输出文件的编码已经变成utf-8了。输入文件本身是ANSI编码,也就是GBK。

1 回复 有任何疑惑可以回复我~
#1

风中过客

请问 是不是这样理解: 输入文件本身是ANSI编码,也就是GBK,所以 1先 new InputStreamReader(fileInput, "GBK"); GBK方式读取 2 System.out.println(line); 因为1,所以能够正常显示?
2015-05-12 回复 有任何疑惑可以回复我~
#2

风中过客

3 接下来 new OutputStreamWriter(fileout,"UTF-8"); 设置 按UTF-8编码方式把char流编码成byte流 4 writer.write(line); 写入到dest2.txt 文件中。 因此,如果要读取dest2.txt中的编码, 要按new InputStreamReader(fileInput, "UTF-8"); 才能正常显示,对吗?
2015-05-12 回复 有任何疑惑可以回复我~

好吧,我其实小白了,以后不会不实验就乱回答问题的。 

正解是:有影响。

我实验了几次,以下是实验步骤:

硬盘上的src.txt的默认编码是ANSI,所以你在硬盘上测试本身就是个未知数。

1.先在你项目的src下建立src.txt,输入几个汉字。

2.运行测试代码

	public static void main(String[] args) throws Exception {
		
		File file = new File("src/dest.txt");
		System.out.println(file);
		FileInputStream fileInput = new FileInputStream("src/src.txt");
		FileOutputStream fileout = new FileOutputStream(file);
		InputStreamReader reader = new InputStreamReader(fileInput, "GBK");
		OutputStreamWriter writer = new OutputStreamWriter(fileout,"utf-8");
		int c;   
		char[] line = new char[10*1024];
		while((c = reader.read(line,0, line.length))!=-1){
			writer.write(line);			
			System.out.println(line);
		}
		fileout.close();
		fileInput.close();
	}

3.refresh项目,会发现里面多了dest.txt  里面是乱码。

1 回复 有任何疑惑可以回复我~

额,我试了下直接写write(line)是可以的。。。   关于编码,把GBK和utf-8位置一换就成乱码了


0 回复 有任何疑惑可以回复我~

可能你是代码敲错的原因吧,没有write(byte[])这种用法,编码应该是有影响的。

0 回复 有任何疑惑可以回复我~

你好啊,首先我觉得你有行代码敲错了,倒数第5行,应该是writer.write(line,0,line.length);

line是一个字节数组,write(int c)是写入单个字符,write(byte[],offset,length)是把内存中的字符数组,写入到流。另外,回答你的问题,它是while循环的结束条件,如果等于-1,表示文件,读取完毕。

0 回复 有任何疑惑可以回复我~
#1

风中过客

char[]line=new char[10*1024]; 字符数组啊
2015-05-12 回复 有任何疑惑可以回复我~

while((c=reader.read(line,0, line.length))!=-1)   为什么是不等于-1,??

0 回复 有任何疑惑可以回复我~
#1

Lemuria

读到文件的末尾返回值是-1,如果!-1则是还未读完文件,也就是未到末尾
2014-11-27 回复 有任何疑惑可以回复我~
#2

Flames

当文件读完时返回-1,还没读完返回读的个数
2014-12-22 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
文件传输基础——Java IO流
  • 参与学习       133770    人
  • 解答问题       1030    个

为您介绍IO流的使用,以及对象的序列化和反序列化的内容

进入课程
意见反馈 帮助中心 APP下载
官方微信