java.util.Scanner在读取大文件时出现故障

java.util.Scanner在读取大文件时出现故障,java,io,java.util.scanner,Java,Io,Java.util.scanner,我写了一个程序,我使用扫描仪从日志文件中读取行,并解析每行以找到重要的内容。读取日志文件的每一行非常重要。我写了下面的代码来扫描每一行 Scanner s = new Scanner(new File("Large.log")); while(s.hasNextLine()) { String line = s.nextLine(); //do the processing of the log line } 上述代码的行为方式很奇怪。它在随机数行之后(大约100万行之后)停止

我写了一个程序,我使用扫描仪从日志文件中读取行,并解析每行以找到重要的内容。读取日志文件的每一行非常重要。我写了下面的代码来扫描每一行

Scanner s = new Scanner(new File("Large.log"));
while(s.hasNextLine())
{
    String line = s.nextLine();
    //do the processing of the log line
}
上述代码的行为方式很奇怪。它在随机数行之后(大约100万行之后)停止读取行。我修改了上面的代码来检查最后一行的读取,还使用Notepad++检查了日志文件。在那一行之后,文件中还有很多行。我在
while
循环结束后添加了另一个
System.out.println(s.hasNextLine())
,它打印false


但是,如果我尝试使用
BufferedReader
执行上述操作,程序运行良好。Java中的util IO类有任何限制吗?

这听起来像是特定JVM实现的问题。在32位OSs上,许多标准文件I/O无法处理大于4 GB的文件是一个常见问题。通常有文件API的替代版本来显式支持大型文件,但是实现JVM的人必须记住使用这些版本。出于好奇,您使用的是什么操作系统?它是64位的吗?

我刚刚将一个包含50个字符的字符串转储到一个临时文件中,并将该字符串重复了500万次。当我试图逐行读取文件时,扫描仪对我来说很好

我认为在您的案例中可能存在两个问题:

  • 可能您正试图读取一条通过扫描仪内部缓冲区大小来读取一行的大行
  • 虽然不太可能,但我希望不同的进程/线程不会同时修改同一个文件

  • 当您使用BufferedReader时,您使用的是readLine()还是read()?最后一行读取是随机的还是固定的,或者“随机行数”是由文件或屏幕的打印输出决定的?我使用了相同的读取行。最后一行是随机的。读取的行数是随机的。抱歉,另一个愚蠢的问题是,在您读取文件时是否有另一个进程将行附加到文件中?例如,随机读取的行数实际上在增加吗?没有这种情况发生。这是一个独立进程,没有任何其他进程/线程的干预。我使用的是64位Windows 7。JDK1.6更新21。日志文件为3.12 GB。