Сбой работы сканера при чтении больших файлов - PullRequest
3 голосов
/ 13 февраля 2011

Я написал программу, в которой я использовал сканер для чтения строк из файлов журнала и анализа каждой строки, чтобы найти что-то важное. Важно, чтобы я прочитал каждую строку файла журнала. Я написал следующий фрагмент кода для сканирования каждой строки

Scanner s = new Scanner(new File("Large.log"));
while(s.hasNextLine())
{
    String line = s.nextLine();
    //do the processing of the log line
}

Приведенный выше код ведет себя странным образом. Он останавливает чтение строк после случайного числа строк [примерно после 1 миллиона строк]. Я изменил приведенный выше код, чтобы проверить последнюю прочитанную строку, а также проверил файл журнала, используя Notepad ++. После этой конкретной строки в файле осталось много строк. Я добавил еще один System.out.println(s.hasNextLine()) после окончания цикла while, и он печатает false.

Однако, если я попытаюсь сделать выше, используя BufferedReader, программа работает нормально. Есть ли какие-либо ограничения в использовании утилит IO в Java?

Ответы [ 2 ]

3 голосов
/ 13 февраля 2011

Это звучит как поддержка больших файлов проблема с вашей конкретной реализацией JVM.Для многих стандартных файловых операций ввода-вывода является распространенной проблемой не работать с файлами> 4 ГБ в 32-разрядных ОС.Как правило, существуют альтернативные версии файловых API для явной поддержки больших файлов, но человек, реализующий JVM, должен помнить об их использовании.Из любопытства, какую операционную систему вы используете и 64-битная?

0 голосов
/ 13 февраля 2011

Я просто выбросил строку, содержащую 50 символов, во временный файл, повторяя строку 5 миллионов раз. И сканер прекрасно работает, когда я пытаюсь прочитать файл построчно.

Я вижу две возможные проблемы в вашем случае:

  1. Может быть, вы пытаетесь прочитать огромную строку, которая передает размер внутреннего буфера сканера для чтения строки?
  2. Хотя это маловероятно, я надеюсь, что нет одновременных изменений в одном и том же файле другим процессом / потоком.
...