Java Scanner读取文件的奇怪行为

因此,我在使用Scanner类从文件中读取内容时遇到了一个有趣的问题。 基本上,我正在尝试从目录中读取解析应用程序生成的几个输出文件,以计算一些准确度指标。

基本上,我的代码只是遍历目录中的每个文件,并使用扫描程序打开它们来处理内容。 无论出于何种原因,扫描仪都没有读取一些文件(所有UTF-8编码)。 即使文件不为空,scan.hasNextLine()在第一次调用时也会返回false(我打开调试器并观察它)。 我每次都使用File对象直接初始化扫描程序(文件Objects已成功创建)。 即:

File file = new File(pathName); ... Scanner scanner = new Scanner(file); 

我尝试了几件事,并最终通过以下方式初始化扫描仪来解决此问题:

  Scanner scanner = new Scanner(new FileInputStream(file)); 

虽然我很高兴解决了这个问题,但我仍然对以前可能发生的问题感到好奇。 有任何想法吗? 非常感谢!

根据Java 6u23中的Scanner.java源,检测到新行

 private static final String LINE_SEPARATOR_PATTERN = "\r\n|[\n\r???]"; private static final String LINE_PATTERN = ".*("+LINE_SEPARATOR_PATTERN+")|.+$"; 

因此,您可以检查是否可以将以下正则表达式与未读取的文件中的内容进行匹配。

 .*(\r\n|[\n\r???])|.+$ 

我还会检查是否有exception。

更新:这让我很好奇,我寻找答案。 似乎你的问题已在此处被提出并解决: Java Scanner(文件)行为不端,但Scanner(FIleInputStream)始终使用相同的文件

总结它是关于ASCII之外的字符,根据您是使用File还是FileInputStream初始化Scanner,它们的行为会有所不同。

我会尝试检查你是否总是在阅读文件后关闭扫描仪。 你也只调用hasNextLine()和nextLine(),还是在那个扫描仪上调用另一个nextXXX()方法?