无法读取任何包含特定字符的文件

时间:2017-11-21 08:23:38

标签: java file character-encoding

TL; DR

为什么在的{​​{1}}中找不到任何数据的文件?

问题:

到目前为止,我一直在使用普通的'Notepad(版本6.1)来读/写文本,以便在这里测试/回答问题。

在文本文件内容中读取的简单代码,并将它们打印到控制台:

Notepad

一切都很好,线条按预期打印。

然后,如果我在文本文件中的任何位置放入完全字符:Scanner sc = new Scanner(new File("myfile.txt")); while (sc.hasNextLine()) { String text = sc.nextLine(); System.out.println(text); } ,它将不会读取任何文件,也不会向控制台打印任何内容。

我当然可以使用或其他(更好的)文本编辑器,没有问题,文本(包括短划线字符)将按预期打印。

我也可以使用Notepad++指定UTF-8,它会正常工作:

Notepad

在我的原始File fileDir = new File("myfile.txt"); BufferedReader in = new BufferedReader( new InputStreamReader( new FileInputStream(fileDir), "UTF8")); String str; while ((str = in.readLine()) != null) { System.out.println(str); } 文件中,如果我将文本(包括Notepad)复制并粘贴到并将这两个文件与Notepad++进行比较,则会告诉我WinMerge上的短划线为Notepad,但上的短划线为Notepad++

问题:

为什么在–的文本文件中使用时,它会读取 nothing ,基本上告诉我Notepad是假的?它是否至少在包含此特定字符的行之前读取输入?

重现的步骤:

  • 在Windows 7上,右键单击并创建新的文本文档。
  • 将任何文本放入文件中(不带任何特殊字符)
  • 在文件中的任意位置输入此字符:hasNextLine()
  • 运行上面第一段代码

输出:,即不打印任何的文字。

PS:

我知道昨天我问过一个类似的(好吧,它最终是一样的)question但不幸的是,似乎我可能没有很好地解释自己,或者一些观众没有完全阅读题。无论哪种方式,我想我已经在这里解释得更好了。

2 个答案:

答案 0 :(得分:3)

问题似乎是编码的差异。您必须使用与写入文件相同的编码进行读取。

您的系统记事本可能使用Windows-1252(或Cp-1252)编码。这种编码存在问题,字符范围在128到159之间.Dash位于此范围之间。该范围不存在于等效的ISO 8859-1中,并且仅存在于Cp1252编码中。

enter image description here

Eclipse在读取记事本文件时,假定该文件具有ISO-8859-1编码(因为它是等效的)。但是ISO-8859-1中没有这个字符,因此存在问题。如果你想从Java读取,你必须指定Cp1252,你应该得到你的输出。

当使用UTF-8编写记事本中的文件时,这也是使用UTF-8的代码正常工作的原因。

答案 1 :(得分:0)

缓冲读取器读取的内容多于当前行,可能是文本到有问题的字节。 Charset.CharsetDecoder.onMalformedInput然后发挥作用,并且发生了一些限制性的事情,我通常没有预料到这一点。

您使用特殊的JDK吗?你在地毯下擦拭异常吗?就像包裹上述代码的lambda一样。 (添加抓住Throwable)

您的平台编码是-Dfile.encoding=ISO-8859-1而不是Cp1252