在 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的问题 一个程序中如何多次调用BufferedReader 我第二次调用的时候无法读取数据 如