我正在使用类BufferedReader
在缓冲区中逐行读取。当读取缓冲区中的最后一行时,我想再次从缓冲区的开头读取。
我已经阅读了有关mark()
和reset()
的内容,我不确定其用法,但我认为他们无法帮助我解决此问题。
有没有人知道如何在到达最后一行后从缓冲区的开头开始阅读?我们可以使用seek(0)
的{{1}}?
答案 0 :(得分:35)
标记/重置是你想要的,但你不能在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));
(注意,建议不要使用默认字符集,只使用简化示例)。
答案 1 :(得分:4)
是的,标记和重置是您要使用的方法。
// 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();
答案 2 :(得分:0)
这对我有用,可以解决这个问题。我一行一行地阅读文件。我很早就在我的程序中做了一个BufferedReader。然后我检查readLine是否为null并执行myFile.close然后执行新的BufferedReader。第一次传递时,readLine变量将为null,因为我将其设置为全局,然后还没有完成readLine。变量全局定义并设置为null。结果,发生了一个接近的新BufferedReader。如果我在程序的最开始没有做BufferedReader,那么myFile.close会在第一遍中抛出一个NPE。
当文件逐行读取时,此测试失败,因为readLine不为null,测试中没有任何反应,文件解析的其余部分继续。
稍后,当readLine到达EOF时,它再次被视为null。 IE:第二次通过此检查还会执行myFile.close和新的BufferedREader,它会将readLine重新设置为重新开始。
实际上,在我的循环内部或循环外部,此操作仅发生在全局设置为null或EOF的readLine变量上。在任何一种情况下,我都会重置"重置"回到文件的开头和一个新的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"));
}