2012-12-14 72 views
7

因此,我在使用Scanner类从文件读取内容时遇到了一个有趣的问题。基本上,我试图从目录中读取由解析应用程序生成的几个输出文件,以计算一些准确度度量。用java扫描仪读取文件的怪异行为

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

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

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

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

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

+0

我在一起窃取一些东西,遇到了确切的问题。 FileInputStream来拯救! – masher

回答

3

根据Java中的Scanner.java源6u23新线由

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字符,所表现的不同取决于你是否初始化文件或的FileInputStream扫描仪。

+0

没有例外,我在try catch块中包含了代码。我查看了导致问题的文件 - 每个文件都是由应用程序生成的,并且是标准的机器可读格式。文件夹中有100个文件,其中5个导致了这个问题。因为生成文件的应用程序实际上是以标准方式构建它们,所以我期望行分隔符正在工作。我会继续并确保正则表达式存在于这些文件中。 – shaunvxc

+0

然而,奇怪的部分是,当我用FileInputStream而不是文件初始化扫描器时,它一切正常 - 它读取内容完美无缺。 – shaunvxc

+0

刚刚找到答案,请参阅我的更新。 – Will

0

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

+0

对不起,我应该包括在我的问题 - 是的,我在每个文件后关闭扫描器,我只是调用hasNextLine()和nextLine()。对于导致问题的特定文件,第一次调用hasNextLine()返回false。 – shaunvxc

+0

您是否在尝试从这些“奇怪”文件读取时调试扫描仪? – Behnil

+0

是的,当我查看Scanner对象时,它的缓冲区完全是空的。 – shaunvxc