Как я могу прочитать большой файл постепенно?

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

3 ответа

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

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

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

 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 ) ;
      }
 }

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

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

Другие вопросы по тегам