尝试读取文本文件时输出错误

时间:2015-06-23 06:04:51

标签: java character-encoding java-io

我想阅读并打印文本文件到控制台,所以我使用下面的代码

File file = new File("G:\\text.txt");
FileReader fileReader = new FileReader(file);
int ascii = fileReader.read();

while (ascii != -1)
{
result = result + (char) ascii;
ascii = fileReader.read();
}
System.out.println(result);

虽然我得到了正确的结果,但在某些情况下我会得到一些奇怪的结果。假设我的文本文件中包含此文本:

Hello to every one

为了得到一个文本文件,我使用了记事本,当我改变编码模式时,我的代码会得到奇怪的输出。

Ansi:每个人都好

Unicode:ÿþhe t o e o v e r y o e

Unicode big endian:þÿh o l o o o o v e r y o e

UTF-8:你好,每个人

为什么我会得到这些奇怪的输出?我的代码有问题吗?或者还有其他原因

1 个答案:

答案 0 :(得分:5)

您的文件以byte-order mark(U + FEFF)开头。它应该只出现在文件的第一个字符中 - 它并没有被广泛使用,但各种Windows工具都包含它,包括记事本。你可以从第一行的开头剥离它。

顺便说一句,我强烈建议使用FileReader not - 它不允许您指定编码。我使用Files.newBufferedReader,并指定编码或将其默认为UTF-8(而不是FileReader使用的系统默认编码)。当您使用BufferedReader时,您可以只使用readLine()一次读取一行:

 String line;
 while ((line = reader.readLine()) != null) {
     System.out.println(line.replace("\uFEFF", ""));
 }

如果确实想要一次读取一个角色,那么习惯于在循环中使用StringBuilder而不是重复的字符串连接。另请注意,您的变量名ascii具有误导性:它实际上是UTF-16代码单元,可能是也可能不是ASCII字符。

您指定的编码应与用于编写文件的编码相匹配 - 此时,在使用Unicode和Unicode big endian时,您应该看到正确的输出而不是每个“真实”字符之间的额外字符。