以下是我的代码的快照,输入文件大小为 45 Mb
Scanner fileScanner = new Scanner(file);
String scannedFarm;
try{
Pattern p = Pattern.compile("^(?:.+(?:\\r?\\n|\\Z)){2,}",Pattern.MULTILINE);
while((scannedFarm = fileScanner.findWithinHorizon(p, 0)) != null){ // Throws Exception
...
...
我将添加任何其他信息来阐明抛出异常的原因。 描述文件格式的相关问题可能会有所帮助:Java, Regular Expression HasNext starts with empty line, multi-platform support .
顺便说一句:这适用于像 super 按钮这样的小文件,对于较大的文件则失败,字符串是否具有从 findWithinHorizon 返回的最大大小?
更新
按照要求提供一个小的堆栈跟踪:
还有一个文件快照的小示例:
最佳答案
我不知道 Scanner
类的工作原理,但是无论 .findwithinHorizon()
对正则表达式做什么,该正则表达式都非常奇怪。
只要每一行至少有一个字符长,此正则表达式将立即匹配整个文件。如果有空行,那么它将匹配空行之间至少跨越两行的所有 block 。如果这就是您真正想要做的,那么有更好的方法:
Pattern p = Pattern.compile("(?:^.+$(?:\\r?\\n)?){2,}", Pattern.MULTILINE);
为了避免正则表达式引擎不必要的回溯,您可以将所有量词设置为 possessive :
Pattern p = Pattern.compile("(?:^.++$(?:\\r?+\\n)?+){2,}+", Pattern.MULTILINE);
无论有或没有所有格量词,此正则表达式匹配如下:
关于Java,扫描大文件,findWithinHorizon(p, 0) 抛出异常 java.lang.StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13240385/