FileOutputStream写入中文字符后,然后用FileInputStream一个个读取出来会乱码问题。

问题

在我们用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;
        while((temp=fis.read())!=-1){//一个字节一个字节的读取文件
            System.out.print((char) temp);   //将字节转成char输出
        }
        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!

猜你喜欢

转载自blog.csdn.net/Chianz632/article/details/79962165
今日推荐