Java BufferedReader回到文本文件的顶部?

我目前有2个BufferedReader初始化在同一个文本文件。 当我用第一个BufferedReader读取文本文件时,我使用第二个文件从顶部再次传递文件。 多次通过相同的文件是必要的。

我知道关于reset() ,但它需要先调用mark()mark()需要知道文件的大小,我不认为我应该打扰。

想法? 包? 库? 码?

谢谢TJ

刚刚创build一个新的BufferedReader从顶部读取的缺点是什么? 我希望操作系统caching文件,如果它足够小。

如果你关心性能,你certificate它是一个瓶颈? 我只是做最简单的事情,而不是担心,直到你有一个特定的理由。 我的意思是,你可以把所有东西都读入记忆中,然后对结果进行两次传递,但是再一次,这将比从头再读一遍新的读者复杂得多。

缓冲读取器是为了顺序读取文件。 你正在寻找的是java.io.RandomAccessFile ,然后你可以使用seek()把你带到你想要的文件中。

随机访问阅读器是这样实现的:

 try{ String fileName = "c:/myraffile.txt"; File file = new File(fileName); RandomAccessFile raf = new RandomAccessFile(file, "rw"); raf.readChar(); raf.seek(0); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

"rw"是这里详述的模式字符。

顺序访问读取器的设置是这样的,他们可以实现他们的缓冲区,事情不能在他们的脚下改变。 例如,提供给缓冲阅读器的文件阅读器只能由缓冲阅读器操作。 如果有另一个位置可能会影响它,您可能会有不一致的操作,因为一个阅读器在文件阅读器中的位置提前,而另一个阅读器希望它保持不变,现在您使用另一个阅读器,并且位于未确定的位置。

最好的方法是改变你的algorithm,你不需要第二遍。 当我不得不处理大量(但不是很糟糕,也就是几GB)的文件时,我使用了这种方法几次,这些文件不符合可用内存。

这可能很难,但性能增益通常是值得的

关于标记/重置:

BufferedReader中的标记方法需要一个readAheadLimit参数,这个参数限制了在复位变得不可能之前标记之后您可以读取的距离。 重置实际上并不意味着文件系统寻道(0),它只是在缓冲区内寻找。 引用Javadoc:

readAheadLimit – 限制仍可保留标记的字符数。 读取这些字符后,试图重置stream可能会失败。 大于input缓冲区大小的限制值将导致分配新的缓冲区,其大小不小于限制。 因此应该小心使用大的值。

“在BufferedReader中关于mark()和reset()的整个业务都是糟糕的devise。”

为什么不扩展这个类,让它在构造函数()中做一个mark(),然后在topOfFile()方法中执行seek(0)。

BR,
〜一