Сбросить буфер с помощью BufferedReader в Java?

Я использую класс BufferedReader для чтения строки за строкой в ​​буфере. При чтении последней строки в буфере я хочу снова начать чтение с начала буфера. Я читал о mark() и reset(), я не уверен, как они используются, но я не думаю, что они могут помочь мне в этом.

Кто-нибудь знает, как начать чтение с начала буфера после достижения последней строки? Например, мы можем использовать seek(0) из RandomAccessFile?


person ipkiss    schedule 24.03.2011    source источник
comment
Непонятно, что вы спрашиваете. Вы имеете в виду начало буфера или файла? seek(0) приведет вас к началу файла, а RandomAccessFile не имеет буфера.   -  person user207421    schedule 16.02.2016


Ответы (3)


mark/reset - это то, что вам нужно, однако вы не можете использовать его в BufferedReader, потому что он может сбрасывать только определенное количество байтов (размер буфера). если ваш файл больше этого, он не будет работать. нет «простого» способа сделать это (к сожалению), но с этим не так уж сложно справиться, вам просто нужен дескриптор исходного FileInputStream.

FileInputStream fIn = ...;
BufferedReader bRead = new BufferedReader(new InputStreamReader(fIn));

// ... read through bRead ...

// "reset" to beginning of file (discard old buffered reader)
fIn.getChannel().position(0);
bRead = new BufferedReader(new InputStreamReader(fIn));

(обратите внимание, что использование наборов символов по умолчанию не рекомендуется, просто используется упрощенный пример).

person jtahlborn    schedule 24.03.2011
comment
Это сбросит вас к началу файла, а не буфера. @ipkiss Если это отвечает на ваш вопрос, ваш вопрос сформулирован плохо. - person user207421; 16.02.2016

Да, пометка и сброс — это методы, которые вы захотите использовать.

// set the mark at the beginning of the buffer
bufferedReader.mark(0);

// read through the buffer here...

// reset to the last mark; in this case, it's the beginning of the buffer
bufferedReader.reset();
person Greg    schedule 24.03.2011
comment
это будет работать только в том случае, если ваш буфер достаточно велик, чтобы вместить весь файл. - person jtahlborn; 24.03.2011
comment
@jtahlborn В вопросе о повторном чтении всего файла нет ничего, только текущий буфер, хотя из принятого ответа видно, что ОП задавал неправильный вопрос. - person user207421; 16.02.2016
comment
Все сводится к тому, что BufferedReaders потребляются, и вы должны создать новый, если файл не маленький. - person ncmathsadist; 17.04.2019

Это помогло мне решить эту проблему. Я читаю файл построчно. Я делаю BufferedReader очень рано в своей программе. Затем я проверяю, имеет ли readLine значение null, и выполняю myFile.close, а затем новый BufferedReader. При первом проходе переменная readLine будет нулевой, поскольку я установил ее таким образом глобально, а затем еще не выполнил readLine. Переменная определена глобально и имеет значение null. В результате происходит закрытие и создание нового BufferedReader. Если я не делаю BufferedReader в самом начале моей программы, то этот myFile.close выдает NPE при первом проходе.

Пока файл считывается строка за строкой, этот тест завершается ошибкой, поскольку readLine не равен нулю, в тесте ничего не происходит, а разбор оставшейся части файла продолжается.

Позже, когда readLine попадает в EOF, он снова оценивается как null. IE: второй проход этой проверки также выполняет myFile.close и новый BufferedREader, который снова сбрасывает readLine обратно в начало.

По сути, внутри моего цикла или вне моего цикла это действие происходит только в том случае, если для переменной readLine глобально установлено значение null или EOF. В любом случае я делаю «сброс», чтобы вернуться к началу файла и новому BufferedReader.

if (readLineOutput == null) { 
//end of file reached or the variable was just set up as null
    readMyFile.close();
    readMyFile = new BufferedReader(new FileReader("MyFile.txt"));
                }
person JavaNoob    schedule 20.07.2017
comment
Это работает, но это не самый эффективный способ сделать это. - person Saad; 01.12.2017
comment
это кажется единственным способом, когда FileReader не поддерживает mark - person FiruzzZ; 27.02.2018