9

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

基本上,我的代码只是遍历目录中的每个文件,然后用扫描仪打开它们以处理内容。出于某种原因,扫描仪没有读取一些文件(全部 UTF-8 编码)。即使文件不是空的,scanner.hasNextLine() 也会在第一次调用时返回 false(我打开调试器并观察到这一点)。我每次都直接使用文件对象初始化扫描仪(文件对象已成功创建)。IE:

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

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

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

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

4

2 回答 2

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 初始化 Scanner。

于 2012-12-14T16:06:31.367 回答
0

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

于 2012-12-14T16:01:01.340 回答