关于文件:Java FileReader编码问题

Java FileReader encoding issue

我试图使用java.io.filereader读取一些文本文件并将它们转换为字符串,但我发现结果编码错误,根本不可读。

这里是我的环境:

  • Windows 2003,OS编码:CP1252

  • 爪哇5

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   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();
    }

上面的代码不起作用。我发现文件阅读器的编码是CP1252,即使文本是UTF-8编码的。但是java.io.filereader的javadoc说:

The constructors of this class assume
that the default character encoding
and the default byte-buffer size are
appropriate.

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


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

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

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

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

您需要使用new InputStreamReader(new FileInputStream(pathToFile), ),而不是filereader。


EDCOX1(0)使用Java的平台默认编码,这取决于它正在运行的计算机的系统设置,并且通常是该区域中用户之间最流行的编码。

如果这个"最佳猜测"不正确,那么您必须显式地指定编码。不幸的是,FileReader不允许这样做(API中的主要监督)。相反,您必须使用new InputStreamReader(new FileInputStream(filePath), encoding),最好从文件的元数据中获取编码。


自Java 11以来,您可以使用:

1
public FileReader(String fileName, Charset charset) throws IOException;