关于readline方法使用的一个中文乱码引发的思考

故事起源于这段代码,我想给一个本地地址然后去读取文件内容,然后使用了reader.readLine();方法,但是本地没有任何报错,但是线上中文乱码导致直接报错了。

 BufferedReader reader;
        try {
            reader = new BufferedReader(new FileReader(
                    filePath));
            String line = reader.readLine();

问题原因:

FileReader属于字符流,是读取字符文件的便捷类。其继承自InputStreamReader,后者是将字节流转换为字符流的的桥梁,即将字节信息转换为字符信息。实际上, FileReader在类内部实现过程中也是利用了InputStreamReader完成字节流到字符流的转化,只不过转化时采用的字符集为系统默认的字符集。
说到默认字符集那就有意思了,之前公司我也使用过这个方法,没报错的原因是一直全部使用linux服务器,linux服务器默认编码是utf-8,所以就没有报错。但是win就不一样了。

举例说明:

如果文件保存时的编码设定为UTF-8, 那么在中文操作系统使用 FileReader时就会发生乱码,因为中文操作系统平台的默认字符集为GBK,这和程序的默认编码或者是文档的编码没有关系。
我把read方法重新修改的内容全部粘贴到这里:提供思路参考。。跳个坑

public List> read(String filePath){
        List> lists = new ArrayList>();
        BufferedReader reader;
        try {
            reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "UTF-8"));
            String line = reader.readLine();
            while (line != null) {

                String str  = line.replaceAll("`","");
                System.out.println("字符串"+str);
                if (str.contains("收支金额")){
                    line = reader.readLine();
                    continue;
                }

                List result = Arrays.asList(str.split(","));
                if (result.size()<=Constant.NUM_INT_5){
                    break;
                }
                System.out.println("导出的结果内容:"+result);
                lists.add(result);
                //                // read next line
                line = reader.readLine();
            }
            reader.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return lists;
    }

反思:

这个现象也在提示我,以后要多多考虑环境问题,固有思维让我觉得只要文件是utf-8,程序的编码是utf-8就一定不会出现中文乱码,其实并不是这样,比如这次的错误,有些java的包不知其所以然是真的不行。越常用的反而要了解透彻

小问题,反而要着重思考。

你可能感兴趣的:(windows,linux,java)