Java 尝试读取文本文件时输出错误
我想读取文本文件并将其打印到控制台,因此我使用以下代码完成了此操作Java 尝试读取文本文件时输出错误,java,character-encoding,java-io,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.printl
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:ÿþe l o o e v e r y o n e
Unicode大端码:þÿe l l o e v e r y o n e
UTF-8:各位好
为什么我会得到这些奇怪的输出?我的代码有问题吗?或者还有其他原因您的文件以U+FEFF开头。它应该只出现在文件的第一个字符中——它的应用并不广泛,但各种Windows工具都包括它,包括记事本。你可以从第一行开始就把它去掉
另外,我强烈建议不要使用FileReader,因为它不允许您指定编码。我会使用Files.newbuffereder,并指定编码,或者让它默认为UTF-8,而不是FileReader使用的系统默认编码。使用BufferedReader时,也可以使用readLine一次读取一行:
如果您真的想一次读取一个字符,那么就应该养成使用StringBuilder的习惯,而不是在循环中重复串接。还请注意,您的ascii变量名有误导性:它实际上是UTF-16代码单元,可能是也可能不是ascii字符
您指定的编码应该与写入文件时使用的编码相匹配-在使用Unicode和Unicode big-endian时,此时您应该看到正确的输出,而不是每个实字符之间的额外字符。您的文件以U+FEFF开头。它应该只出现在文件的第一个字符中——它的应用并不广泛,但各种Windows工具都包括它,包括记事本。你可以从第一行开始就把它去掉
另外,我强烈建议不要使用FileReader,因为它不允许您指定编码。我会使用Files.newbuffereder,并指定编码,或者让它默认为UTF-8,而不是FileReader使用的系统默认编码。使用BufferedReader时,也可以使用readLine一次读取一行:
如果您真的想一次读取一个字符,那么就应该养成使用StringBuilder的习惯,而不是在循环中重复串接。还请注意,您的ascii变量名有误导性:它实际上是UTF-16代码单元,可能是也可能不是ascii字符
您指定的编码应该与用于写入文件的编码相匹配-在使用Unicode和Unicode big-endian时,此时您应该看到正确的输出,而不是每个实字符之间的额外字符。因为编码模式?您已经提到,当您更改编码模式时会发生这种情况。@Gosu:是的,正如您所看到的,当我更改编码模式时,我会得到不同的结果使用InputStreamReader和正确的编码模式来代替?@ElyasHadizadeh您认为不同的编码用于什么?如果它们都给出相同的结果,我们只需要一个编码。您还为最后一个示例UTF-8使用了正确的术语编码。Ansi不是一种编码,您称之为unicode的实际上是UTF-16LE和UTF-16BE。Unicode是字符集,编码是将字符存储为字节的不同方式。@ElyasHadizadeh这是一个非常好的读取:因为编码模式?您已经提到,当您更改编码模式时会发生这种情况。@Gosu:是的,正如您所看到的,当我更改编码模式时,我会得到不同的结果使用InputStreamReader和正确的编码模式来代替?@ElyasHadizadeh您认为不同的编码用于什么?如果它们都给出相同的结果,我们只需要一个编码。您还为最后一个示例UTF-8使用了正确的术语编码。Ansi不是一种编码,您称之为unicode的实际上是UTF-16LE和UTF-16BE。Unicode是字符集,编码是将字符存储为字节的不同方式。@ElyasHadizadeh这是一个非常好的读物:看来你的答案是正确的,你能用正确的方式编写文件吗。newbuffereder@ElyasHadizadeh:你看过文档了吗?你自己也试过使用它吗?能够自己做研究是非常重要的。是的,你完全是对的,谢谢你的建议和回答-乔恩·斯基特:再次非常感谢你,我找到了正确的方法,实际上这行代码:line.replace\uFEFF,非常有用。看来你的答案是正确的,你能写出正确的使用文件的方法吗。newbuffereder@ElyasHadizadeh:你看过
文档,并尝试自己使用它?能够自己做研究是非常重要的。是的,你完全是对的,谢谢你的建议和回答-Jon Skeet:再次非常感谢,我找到了正确的方法,实际上这行代码:line.replace\uFEFF非常有用
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line.replace("\uFEFF", ""));
}