likes
comments
collection

Java读取文件乱码问题修复记录

作者站长头像
站长
· 阅读数 13

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

问题

  • 在用Java中读写含中文的文件时,读出或写入的内容经常会出现乱码的问题

原因

  • 系统的编码和程序的编码采用了不同的编码格式
    • windows自身采用的编码格式是gbk.gbkgb2312基本上是一样的编码方式
    • IDEAEncode默认是utf-8的编码
    • 当在windows中创建并写入的文件编码为gbk. 用程序直接去读会以utf-8方式读取,这样就会乱码
  • 为了避免可能的中文乱码问题,最好在文件写入和读出的时候显式指定编码格式

解决

  • Java中,使用java.io.FileReader或者java.io.FileWriter来读写文件
    • 虽然可以通过java.io.BufferedReaderjava.io.BufferedWriter来提高效率
    • 但是在FileReaderFileWriter中只能获取编码方式,不能设置编码方式
    • 这样导致在FileReaderFileWriter中的编码设置只能服从底层的编码设置,这样就会在读写多种语言编码的文件时出现乱码
  • 采用java.io.FileInputStream或者java.io.InputStreamReaderjava.io.FileOutputStream或者java.io.OutputStreamWriter来解决这个问题
  • InputStreamReaderOutputStreamWriter中,可以通过指定编码方式来完成gbk文件的读写
public class ReadAndWrite {  
    private static void test(){  
        File firstFile = new File("D://fileone.txt");  
        File secondFile=new File("D://filesecond.txt");  
        BufferedReader in = null;  
        BufferedWriter out = null;        
        try {       
            //加入编码字符集   
            in = new BufferedReader(new InputStreamReader(new FileInputStream(firstFile), "gbk"));  
            //加入编码字符集  
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(secondFile), "gbk"));  
            String line = "";  
            while((line = in.readLine())!=null){  
                System.out.println(line);  
                out.write(line+"\r\n");  
            }  
        } catch (FileNotFoundException e) {  
            System.out.println("file is not fond");  
        } catch (IOException e) {  
            System.out.println("Read or write Exceptioned");  
        }finally{             
            if(null!=in){   
                try {  
                    in.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }}  
            if(null!=out){  
                try {  
                    out.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }
           }
     }  
}  

总结

  • BufferedWriter最后一定要关闭,否则内容不会被写入到文件中
  • 使用readLine() 方法时,换行写出要添加