用Java中的BufferedReader重置缓冲区?

java file-io bufferedreader

55786 观看

3回复

5733 作者的声誉

我正在使用类BufferedReader在缓冲区中逐行读取。在读取缓冲区的最后一行时,我想再次从缓冲区的开头开始读取。我已经阅读过有关mark()和的信息reset(),我不确定它的用法,但我认为它们无法帮助我。

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

作者: ipkiss 的来源 发布者: 2011 年 3 月 24 日

回应 (3)


4

29674 作者的声誉

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

// 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();
作者: Greg 发布者: 24.03.2011 03:40

37

48656 作者的声誉

决定

标记/重置是您想要的,但是您不能在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));

(请注意,不建议使用默认字符集,仅使用简化示例即可)。

作者: jtahlborn 发布者: 24.03.2011 04:21

0

9 作者的声誉

这对我来说解决了这个问题。我正在逐行读取文件。我在程序的早期就在做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重新重置为起点。

实际上,在循环内部或循环外部,此操作仅在将readLine变量全局设置为null或EOF时发生。无论哪种情况,我都执行“重置”以返回文件的开头和新的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"));
                }
作者: JavaNoob 发布者: 20.07.2017 12:37
32x32