用Java中的BufferedReader重置缓冲区?

用Java中的BufferedReader重置缓冲区?,java,file-io,bufferedreader,Java,File Io,Bufferedreader,我使用classBufferedReader逐行读取缓冲区中的数据。当读取缓冲区中的最后一行时,我想再次从缓冲区的开头开始读取。 我读过mark()和reset(),我不确定它的用法,但我认为它们不能帮我解决这个问题 有人知道在到达最后一行后如何从缓冲区的开头开始读取吗?就像我们可以使用RandomAccessFile的seek(0)?是的,标记和重置是您想要使用的方法 // set the mark at the beginning of the buffer bufferedReader.m

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


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

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

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

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

(注意,不建议使用默认字符集,只使用一个简化的示例)。

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

当文件逐行读取时,此测试失败,因为读取行不为null,测试中不会发生任何事情,文件解析的其余部分将继续

稍后,当读线到达EOF时,它的值再次为null。IE:第二次通过此检查时,还会执行myFile.close和new BufferedREader,它会将读线重新设置回起始位置

实际上,在我的循环内或循环外,此操作只发生在全局设置为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"));
                }

只有当您的缓冲区足够大,足以容纳整个文件时,这才有效。@jtahlborn关于重新读取整个文件的问题中没有任何内容,只有当前缓冲区,尽管从接受的答案来看,OP提出的问题似乎是错误的。归结起来,BufferedReaders被“消耗”了除非文件很小,否则必须创建一个新文件。这会将您重置为文件的开头,而不是缓冲区@如果这回答了你的问题,你的问题表达得很差。不清楚你在问什么。您是指缓冲区的开始还是文件的开始
seek(0)
会将您带到文件的开头,并且
RandomAccessFile
没有缓冲区。它可以工作,但不是最有效的方法。这似乎是FileReader不支持标记的唯一方法