Java FileReader 编码问题

2022-08-31 08:13:06

我试图使用java.io.FileReader读取一些文本文件并将其转换为字符串,但我发现结果编码错误且根本无法读取。

这是我的环境:

  • 视窗 2003,操作系统编码:CP1252

  • Java 5.0

我的文件是 UTF-8 编码或 CP1252 编码,其中一些(UTF-8 编码文件)可能包含中文(非拉丁)字符。

我使用以下代码来完成我的工作:

   private static String readFileAsString(String filePath)
    throws java.io.IOException{
        StringBuffer fileData = new StringBuffer(1000);
        FileReader reader = new FileReader(filePath);
        //System.out.println(reader.getEncoding());
        BufferedReader reader = new BufferedReader(reader);
        char[] buf = new char[1024];
        int numRead=0;
        while((numRead=reader.read(buf)) != -1){
            String readData = String.valueOf(buf, 0, numRead);
            fileData.append(readData);
            buf = new char[1024];
        }
        reader.close();
        return fileData.toString();
    }

上面的代码不起作用。我发现FileReader的编码是CP1252,即使文本是UTF-8编码的。但是java.io.FileReader的JavaDoc说:

此类的构造函数假定默认字符编码和默认字节缓冲区大小是合适的。

这是否意味着如果我使用FileReader,我不需要自己设置字符编码?但是我目前确实得到了错误编码的数据,处理我的位置的正确方法是什么?谢谢。


答案 1

是的,您需要指定要读取的文件的编码。

是的,这意味着您必须知道要读取的文件的编码。

不,没有一般的方法来猜测任何给定的“纯文本”文件的编码。

FileReader 的单参数构造函数始终使用平台默认编码,这通常是一个坏主意

由于Java 11还获得了接受编码的构造函数:新的FileReader(file,charset)new FileReader(fileName,charset)。FileReader

在早期版本的java中,您需要使用新的InputStreamReader(new FileInputStream(pathToFile))。, <encoding>)


答案 2

FileReader使用 Java 平台的默认编码,这取决于运行 Java 的计算机的系统设置,通常是该区域设置中用户中最流行的编码。

如果这个“最佳猜测”不正确,那么你必须明确指定编码。不幸的是,不允许这样做(API中的主要疏忽)。相反,您必须使用并理想地从有关文件的元数据中获取编码。FileReadernew InputStreamReader(new FileInputStream(filePath), encoding)