io FileReader 乱码问题 求解答

今天复习java基础知识时候遇到个问题。我用流存的时候是UTF-8,但是使用FileReader
读的时候,竟然不乱码。。为什么呢?难道FileReader不是GBK格式吗?

 public static void main(String[] args) throws Exception {
      //writFile(); 
            readFile();
    }
    public static  void readFile()throws Exception{
        FileReader fileReader = new FileReader("F:/a.txt");
        int len=0;
        while ((len=fileReader.read())!=-1) {

            System.out.println((char)len);
        }
        fileReader.close();
    }
    public static void writFile()throws Exception{
        FileOutputStream fileOutputStream = new FileOutputStream("F:/a.txt");
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream,"utf-8");
        outputStreamWriter.write("您好ass");
        outputStreamWriter.close();
    }

你这样new出来的FileReader,底层是使用默认字符编码的,默认字符编码是Charset.defaultCharset(),这个是和运行环境有关的,也可以通过java命令行参数指定。

总之,这个默认字符编码不是一个开发人员完全可以掌控的参数,也许你本机是好的、放到服务器上乱码,或者反之。

所以,这里保险点的办法是先获得字节流(FileInputStream),然后把字节流转成字符流,转的时候是可以自己制定字符编码的,这样不管是什么环境,程序的运行结果都是一致的。

另外,close()方法一定要写在finally{}里,虽然不是正式的代码,但要养成这个习惯。

你怎么知道乱码不乱码的,你的代码读取了文件只是输出了len,它表示的是文件的长度。而且你还把它转换成char。

图片说明

嗯,是的,UTF-8和GBK之间可以互相转换。如果你强制输出的时候用ANSI,那么绝对就是乱码了,你可以试试看。

文件操作直接使用第三方jar吧,使用FileUtil工具类,存和读的时候,都带着字符编码,就不会有这样的问题。https://blog.csdn.net/qq_878799579/article/details/77862014

Reader没有显式指定字符集的时候会使用操作系统默认字符集,最好不要这样做,因为换个环境可能就运行不正常了

我今天也有这个疑问,你可以试试fileReader读GBK反而是乱码,和楼上说的一样是默认字符集决定的,所以说fileReader的编码是默认字符集而不一定是GBK,可以用

System.out.println(Charset.defaultCharset());

试一试,应该会输出UTF-8