尝试读取文本文件时输出错误
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" 字符之间的额外字符。
我想读取文本文件并将其打印到控制台,所以我使用以下代码完成了此操作
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" 字符之间的额外字符。