在Java中处理文件指针的有效方法?(使用带文件指针的BufferedReader)

Sud*_*eer 5 java pointers file buffered

我有一个日志文件,每秒更新一次.我需要定期读取日志文件,一旦我做了阅读,我需要存储的文件指针位置在最后一行我读的结束,并在下次定期读我应该从这一点开始.

目前,我在Java中使用随机访问文件,并使用该getFilePointer()方法获取偏移值,并使用seek()方法转到偏移位置.

但是,我已阅读大多数文章甚至Java doc建议,BufferredReader以便有效地阅读文件.如何使用a实现此目的(获取文件指针并移动到最后一行)BufferedReader,还是有其他有效的方法来实现此任务?

Nei*_*fey 4

有几种可行的方法:

  • 使用 FileInputStream 打开文件,skip() 相关字节数,然后将 BufferedReader 包装在流周围(通过 InputStreamReader);
  • 打开文件(使用 FileInputStream 或 RandomAccessFile),在流/RandomAccessFile 上调用 getChannel() 以获取底层 FileChannel,在通道上调用position(),然后调用 Channels.newInputStream() 从通道获取输入流,您可以将其传递给 InputStreamReader -> BufferedReader。

我还没有诚实地对这些进行分析,看看哪个在性能方面更好,但您应该看看哪个更适合您的情况。

RandomAccessFile 的问题本质上是它的 readLine() 方法效率非常低。如果您可以方便地从 RAF 中读取数据并进行自己的缓冲来分割行,那么 RAF 本身并没有什么问题——只是它的 readLine() 实现得不好