Как я могу прочитать большой файл постепенно?
У меня проблемы с чтением файла с помощью 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 ) ;
}
}
Идея состоит в том, чтобы читать до тех пор, пока вы не найдете токен и не поднимете флаг, когда флаг установлен, вы напечатаете значение, если вы найдете конечный токен, вы отключите флаг.
Должно быть несколько способов закодировать предыдущий псевдокод. Я обновлю этот ответ позже.