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

问题描述 投票:14回答:3

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

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

java file-io bufferedreader
3个回答
36
投票

标记/重置是你想要的,但你不能在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
投票

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

// 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
投票

这对我有用,可以解决这个问题。我正在逐行读取文件。我很早就在我的程序中做了一个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"));
                }
© www.soinside.com 2019 - 2024. All rights reserved.