Как я могу прочитать большой файл постепенно? - PullRequest
4 голосов
/ 27 января 2010

У меня проблемы с чтением файла с помощью Java. Это абсолютно огромный (2,5G), и настройка моей памяти не помогает. Все данные находятся в одной строке, поэтому я не могу прочитать их по одной строке за раз. Я хотел бы прочитать файл, пока не найду определенную строку, например «<| start |>» или «<| end |>», а затем распечатать данные между этими строками, чтобы очистить память и можно продолжить чтение остальной части файла. Итак, что я в основном ищу, так это тип читателя, который начинает читать с определенной начальной строки и останавливает чтение с конечной строки. Кто-нибудь может мне помочь?

Ответы [ 3 ]

9 голосов
/ 27 января 2010

Вам нужно открыть Reader (например, BufferedReader, обертывающий InputStreamReader, обертывающий FileInputStream) и одновременно читать фрагменты с помощью read(char[], int, int) или read(char[]).Вы должны позаботиться о поиске токена, в том числе в том случае, если он начинается в одном фрагменте и заканчивается в другом.Также учтите, что read() может не заполнять буфер;вам нужно использовать возвращаемое значение, чтобы увидеть, сколько данных на самом деле записывается в массив.

2 голосов
/ 27 января 2010

Я бы посмотрел, подходит ли Сканер для ваших данных. Вы можете использовать метод useDelimiter для изменения шаблонов, которые он использует для токенизации ввода.

0 голосов
/ 27 января 2010

Попробуйте этот псевдокод:

 char [] start = {'<','|','s','t','a','r','t','|','>' };

 char [] start = {'<','|','e','n','d','|','>' };

 char [] buff  = new char[9];

 while( true ) {
     char c = readChar();
     if( c  == '<' ) {
         buff = readChars( 9 ) ; 
         if( buff == start ) {
             inside = true ;
             skip( 9 ); // start
         } else if( buff == end )  {
             inside = false;
             skip(7); // end 
         }
      } 
      if( inside ) {
          print( char ) ;
      }
 }

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

Должно быть несколько способов закодировать предыдущий псевдокод. Я обновлю этот ответ позже.

...