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
是假的?它是否至少在包含此特定字符的行之前读取输入?
重现的步骤:
hasNextLine()
输出:–
,即不打印任何的文字。
PS:
我知道昨天我问过一个类似的(好吧,它最终是一样的)question但不幸的是,似乎我可能没有很好地解释自己,或者一些观众没有完全阅读题。无论哪种方式,我想我已经在这里解释得更好了。
答案 0 :(得分:3)
问题似乎是编码的差异。您必须使用与写入文件相同的编码进行读取。
您的系统记事本可能使用Windows-1252(或Cp-1252)编码。这种编码存在问题,字符范围在128到159之间.Dash位于此范围之间。该范围不存在于等效的ISO 8859-1中,并且仅存在于Cp1252编码中。
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
。