我想阅读并打印文本文件到控制台,所以我使用下面的代码
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:你好,每个人
为什么我会得到这些奇怪的输出?我的代码有问题吗?或者还有其他原因
答案 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时,您应该看到正确的输出而不是每个“真实”字符之间的额外字符。