Сбросить буфер с BufferedReader в Java? - PullRequest
14 голосов
/ 24 марта 2011

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

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

Ответы [ 3 ]

36 голосов
/ 24 марта 2011

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

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

4 голосов
/ 24 марта 2011

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

// 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();
0 голосов
/ 20 июля 2017

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

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

Позже, когда readLine достигает EOF, он снова оценивается как ноль. 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"));
                }
...