Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试读取文本文件时输出错误_Java_Character Encoding_Java Io - Fatal编程技术网

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", ""));
 }