问题
在我们用FileOutputStream写入中文和英文,然后用FileInputStream一个个读出来时,发现中文字符会出现乱码,而英文字符保持不变。
看如下代码:
package FileStream;
import java.io.*;
import java.util.Scanner;
public class Dome {
public static void main(String[] args) throws IOException {
Scanner input=new Scanner(System.in);
File file=new File("stream.txt");
System.out.println("请输入要写的内容:");
String str=input.nextLine();
FileOutputStream fos=new FileOutputStream(file);
fos.write(str.getBytes());
System.out.println("写入完毕!");
fos.close();
FileInputStream fis=new FileInputStream(file);
int temp=0;// 解决方案:byte bytes[]=new byte[1024]; 充当缓存区
while((temp=fis.read())!=-1){//一个字节一个字节的读取文件 解决方案:(temp=fis.read(bytes))!=-1
System.out.print((char) temp); //将字节转成char输出 解决方案:new String(bytes,0,temp) 输出结果 从 0-temp
}
fis.close();
}
}
输出结果:
原因
因为FileInputStream是基于字节的文件输入流,而且我用的是没有参数的read()方法,也就是一个字节一个字节的从硬盘里读取数据,并且输出。英文占一个字节,读出可直接转成char类型输出。汉字一般占两个字节,而你只读一个字节就输出了。所以读到汉字时会乱码。
解决方案
根据以上原因,我们可以自己定义一个byte数组(缓冲区),每次读的字节数由我们控制。比如说:byte bytes[]=new byte[1024]; 然后读的时候read(bytes); 这样每次最多可以读1kb的数据放入bytes数组(缓冲区)中,然后将bytes中的数据输出即可。这样效率会比较高,对硬盘的损害也比较低(当你一个一个读时对硬盘的操作次数会比较多,而对于缓冲区,我们每一次可以读一大截数据,直接放入),延长硬盘的使用寿命。另一种方法就是用到IO流中的缓冲流BufferedInputStream,后面会写,敬请期待!
每日鸡汤:After all,tomorrow is another day!
Over!