使用Java中的BufferedReader重置缓冲区?

ipk*_*iss 15 java file-io bufferedreader

我正在使用类BufferedReader在缓冲区中逐行读取.当读取缓冲区中的最后一行时,我想再次从缓冲区的开头读取.我已经读过关于mark()和reset()的内容,我不确定它的用法,但我不认为它们可以帮助我解决这个问题.

有没有人知道如何在到达最后一行后从缓冲区的开头开始阅读?就像我们可以使用RandomAccessFile的seek(0)一样?请.谢谢

jta*_*orn 37

标记/重置是你想要的,但你不能在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));
Run Code Online (Sandbox Code Playgroud)

(注意,建议不要使用默认字符集,只使用简化示例).

  • 这会将您重置到*文件的开头,而不是缓冲区的开头。@ipkiss如果此回答您的问题,则您的问题表达不佳。 (2认同)

Gre*_*reg 5

是的,标记和重置是您将要使用的方法。

// 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();
Run Code Online (Sandbox Code Playgroud)

  • 这仅在您的缓冲区足够大以容纳整个文件时才有效。 (22认同)
  • 归结为 BufferedReaders 已被“消耗”,除非文件很小,否则您必须创建一个新的。 (2认同)