我不知道为什么我得到一个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。