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

时间:2011-03-24 15:35:59

标签: java file-io bufferedreader

我正在使用类BufferedReader在缓冲区中逐行读取。当读取缓冲区中的最后一行时,我想再次从缓冲区的开头读取。 我已经阅读了有关mark()reset()的内容,我不确定其用法,但我认为他们无法帮助我解决此问题。

有没有人知道如何在到达最后一行后从缓冲区的开头开始阅读?我们可以使用seek(0)的{​​{1}}?

3 个答案:

答案 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"));
                }