Java FileReader 编码问题

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

这是我的环境:

  • Windows 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 的 JavaDoc。FileReader 表示:

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

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

198724 次浏览

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

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

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

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

因为 Java11FileReader也获得了接受编码的构造函数: new FileReader(file, charset)new FileReader(fileName, charset)

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

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

如果这个“最佳猜测”不正确,那么您必须显式地指定编码。遗憾的是,FileReader不允许这样做(API 中的主要疏忽)。相反,您必须使用 new InputStreamReader(new FileInputStream(filePath), encoding),并在理想情况下从文件的元数据中获取编码。

从 Java11开始,你可以使用:

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

对于 Java7 + 医生,您可以使用以下代码:

BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8);

这里是所有的字符 医生

例如,如果您的文件在 CP1252中,则使用此 方法

Charset.forName("windows-1252");

下面是 IO 和 NIO 医生的 Java 编码的其他规范名称

如果你不知道确切的编码你已经得到了一个文件,你可以使用一些第三方库像这个工具从谷歌 这个的工作相当整洁。

对于另一种拉丁语言,例如西里尔语,你可以使用这样的东西:

FileReader fr = new FileReader("src/text.txt", StandardCharsets.UTF_8);

并确保您的 .txt文件以 UTF-8(但不是默认的 ANSI)格式保存。干杯!

带有 InputStreamReader 的 FileInputStream 比直接使用 FileReader 要好,因为后者不允许指定编码字符集。

下面是一个共同使用 BufferedReader、 FileInputStream 和 InputStreamReader 的示例,这样您就可以从文件中读取行。

List<String> words = new ArrayList<>();
List<String> meanings = new ArrayList<>();
public void readAll( ) throws IOException{
String fileName = "College_Grade4.txt";
String charset = "UTF-8";
BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream(fileName), charset));


String line;
while ((line = reader.readLine()) != null) {
line = line.trim();
if( line.length() == 0 ) continue;
int idx = line.indexOf("\t");
words.add( line.substring(0, idx ));
meanings.add( line.substring(idx+1));
}
reader.close();
}