扫描器NoSuchElementException与换行终止文件1025字符长



我不知道为什么我得到一个NoSuchElementException。我正在读取的文件是一个LF终止,并且该代码已经在生产环境中运行了一年。在调试过程中,我的同事发现,当文件以LF结尾并且长度正好为1025个字符时(尽管原始文件长度为10132个字符),可以再现错误。这个错误在Linux和Windows上都是可重复的,我尝试了JDK 1.6.0_30, JRE 1.7和JDK 1.7.0_07。如果您将Pattern更改为"~$?"或"~r?n?",则错误将消失。

public static void main(String[] args) throws FileNotFoundException {
    String filepath = "file.txt";               
    Scanner s = null;
    try {
        s = new Scanner(new File(filepath));
        s.useDelimiter(Pattern.compile("~n?", Pattern.UNIX_LINES));
        while (s.hasNext()) {
            System.out.println(s.next());
        }
    } finally {
        if (s != null)
            s.close();
    }
}

欢迎指教。

谢谢!

编辑1
我刚刚尝试了Scanner的GNU Classpath实现,该版本的Scanner工作得很好。

我们来结束这个…如果扫描器模式以可选的新行n?你可能会得到NoSuchElementException。问题出在扫描器的实现上,但有一些简单的解决方法:

  • 扫描行并应用没有n?的正则表达式
  • (?:r?n?)结束扫描;这是有效的,因为它迫使扫描器在缓冲区中拉更多的字符跳过边缘情况。
  • 终止scan $?;它检测行结束,但不选择插入符号return/new line。

最新更新