Java Scanner读取文件的奇怪行为

时间:2012-12-14 15:45:28

标签: java

因此,我在使用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));

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

2 个答案:

答案 0 :(得分:5)

根据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???])|.+$

另外,我会检查是否有一些例外。

<强>更新 这让我很好奇,我寻找答案。似乎您的问题已在此处被询问和解决: Java Scanner(File) misbehaving, but Scanner(FIleInputStream) always works with the same file

总结它是关于ASCII以外的字符,根据您是使用File还是FileInputStream初始化扫描程序,其行为会有所不同。

答案 1 :(得分:0)

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