Reset буфер с BufferedReader в Java?

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

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

Ответ 1

mark/reset - это то, что вы хотите, однако вы не можете использовать его на BufferedReader, потому что он может только reset вернуть определенное количество байтов (размер буфера). если ваш файл больше этого, он не будет работать. нет "простого" способа сделать это (к сожалению), но это не слишком сложно обрабатывать, вам просто нужен дескриптор исходного 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));

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

Ответ 2

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

// 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 the beginning of the buffer
bufferedReader.reset();

Ответ 3

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

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

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

Эффективно, внутри моего цикла или вне моего цикла это действие происходит только при переменной readLine, глобально заданной как null или EOF. В любом случае я делаю "reset", чтобы вернуться в начало файла и новый 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"));
                }