【问题标题】:Weird behavior with java Scanner reading filesjava Scanner读取文件的奇怪行为
【发布时间】:2012-12-02 15:24:59
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 我正在一起破解一些东西并遇到了您的确切问题。拯救 FileInputStream!

标签: java


【解决方案1】:

根据 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。

【讨论】:

  • 没有引发异常,我已将代码包围在 try catch 块中。我查看了导致问题的文件——每个文件都是由应用程序生成的,并且是标准的机器可读格式。该文件夹中有 100 个文件,其中 5 个文件导致了此问题。因为生成文件的应用程序实际上以标准方式构建它们,所以我希望行分隔符可以正常工作。我会继续确保这些文件中存在正则表达式。
  • 然而,奇怪的是,当我使用 FileInputStream 而不仅仅是文件初始化扫描仪时,一切正常——它可以完美地读取内容,没有任何问题。
  • 我遇到了完全相同的问题。我想补充一点,你没有提到的正则表达式搜索是我灵魂的一部分。问题是从网络浏览器粘贴的文本包含一些超出范围的字符,导致 Scanner.hasNext() 和 Scannner.next() 无法正常工作。 FileInputStream 解决了它。
【解决方案2】:

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

【讨论】:

  • 对不起,我应该在我的问题中包含这个 - 是的,我在每个文件之后都关闭了扫描仪,我只调用了 hasNextLine() 和 nextLine()。对于导致问题的特定文件,第一次调用 hasNextLine() 返回 false。
  • 在读取那些“奇怪”的文件时,您是否尝试过调试扫描仪?
  • 是的,当我查看 Scanner 对象时,它的缓冲区完全是空的..
猜你喜欢
  • 2011-06-10
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多