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

Posted

技术标签:

【中文标题】在 Java 中使用 BufferedReader 重置缓冲区?【英文标题】:Reset buffer with BufferedReader in Java? 【发布时间】:2011-07-22 06:07:18 【问题描述】:

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

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

【问题讨论】:

不清楚你在问什么。您是指缓冲区的开头还是文件的开头? seek(0) 会将您带到文件的开头,而 RandomAccessFile 没有缓冲区。 【参考方案1】:

mark/reset 是你想要的,但是你不能在 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));

(注意,不推荐使用默认字符集,仅使用简化示例)。

【讨论】:

这会将您重置到 文件的开头, 而不是缓冲区。 @ipkiss 如果这回答了你的问题,那么你的问题表达得不好。【参考方案2】:

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

// 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();

【讨论】:

这只有在你的缓冲区足够大以容纳整个文件时才有效。 @jtahlborn 没有关于重新读取整个文件的问题,只有当前缓冲区,尽管从接受的答案看来,OP 提出了错误的问题。 归结为 BufferedReaders 被“消耗”了,除非文件很小,否则您必须创建一个新的。【参考方案3】:

这对我解决这个问题很有帮助。我正在逐行读取文件。我很早就在我的程序中做一个 BufferedReader 。然后,我检查 readLine 是否为 null 并执行 myFile.close,然后执行新的 BufferedReader。第一次通过时,readLine 变量将为 null,因为我在全局范围内设置它,然后还没有完成 readLine。该变量是全局定义的并设置为空。结果,发生了一个关闭的新 BufferedReader。如果我在程序开始时没有执行 BufferedReader,那么这个 myFile.close 会在第一遍抛出 NPE。

当文件逐行读取时,由于 readLine 不为空,因此此测试失败,测试中没有任何反应,文件解析的其余部分继续。

稍后,当 readLine 到达 EOF 时,它再次被赋值为 null。 IE:第二次通过此检查还执行 myFile.close 和 new 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"));
                

【讨论】:

它有效,但不是最有效的方法。 这似乎是 FileReader 不支持 mark 的唯一方法

以上是关于在 Java 中使用 BufferedReader 重置缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 Java 中使用 BufferedReader 读取文件末尾 (EOF)?

在Java中,BufferedReader 是一个啥类啊,有啥作用啊

Java - 使用 BufferedWriter 和 BufferedReader,[重复]

java中的BufferedReader语句如何用?

java中BufferedReader的问题 一个程序中如何多次调用BufferedReader 我第二次调用的时候无法读取数据 如