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

Wrong output when attempting to read a text file

我想读取文本文件并将其打印到控制台,所以我使用以下代码完成了此操作

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

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

安思: 大家好

Unicode : ÿþh e l l o to o e v e r y o n e

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

UTF-8:向大家问好

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

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

顺便说一句,我强烈建议 不要 使用 FileReader - 它不允许您指定编码。我会使用 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 大端时每个 "real" 字符之间的额外字符。