Java文件尾部实现

时间:2016-05-25 16:21:38

标签: java file io

实现一个相当于tail -f somefile

的java文件观察器

我读过几个类似的问题。我看到了一些选择。

  1. 使用BufferedReader,基本思路是使用缓冲读取器从文件中读取。如果返回null,则休眠几秒钟,然后继续无限循环。我对此进行了实验,我的结果显示只要您读到文件的末尾,然后getLine方法将不再为您提供任何更新。那么这种方法有用吗?

  2. 使用random access file。每次进行读取操作,创建随机访问文件并将文件长度与历史长度进行比较,如果当前文件长度较长,则寻找最后读取和读取增量部分。我确定这有效,但每次阅读时都会打开一个新的随机访问文件,是不是有更有效的方法?

  3. 我已经看到新的JDK将stream API添加到缓冲文件阅读器中,我想这与后面附加的新内容无关。它只与最初给出的内容相关。我的问题是,可以将此流API扩展为考虑tailer function吗?

  4. 问题:

    • 可以BufferedReader用于实施tail -f吗?在我的情况下,一旦我读取了通过EOF,只返回null。

    • 可以使用JDK8 stream来实现tail -f吗?

    • 除了像apache common lib这样重复打开关闭文件之外,还有更高效的实现吗?

2 个答案:

答案 0 :(得分:0)

我最终使用了一些Apache库来解决这个问题。 (一旦我记得它就会更新。)

基本上文件监视器依赖于文件系统API。在Linux发行版上,读取EOF可能会很好并带来后来附加的新内容。

我观察到的问题出现在MACO上,一旦你在EOF之后阅读文件处理程序不再有效。如果您知道正在阅读新内容,则必须重新打开该文件。

  • 这是在MacOs Maveriks上,我没有测试它在最新版本上仍然是相同的。
  • 这也是基于JDK api,而不是基础MACOS文件系统API。因为我认为应该更有效地实施less /F tail -f

答案 1 :(得分:-1)

我之前做过这个,根据我的经验,我猜你的问题可能没什么问题 - 在读取之间关闭文件或使用Apache Tailer类可能更好,就像我在类似的问题中建议的那样:

How can I follow a file like "Tail -f" does in Java without holding the file open (Prevent rename/delete)

这不仅有助于您帮助您刷新,还可以防止文件在您阅读时被锁定。

我最终没有使用它(因为在我的环境中获得批准的软件具有挑战性) - 相反,我选择使用这样的过程:

Detect Change
Open file
Seek to previous position
Read to end of file
Remember position for next seek
Close 

这样做很好,解决了很多问题 - 我现在已经使用了一段时间了。

该链接问题中有人建议使用java.nio.file.WatchService.poll()来检测有效的更改 - 但重复读取文件大小也是如此。

你在#2中提到了这种开放/搜索/关闭方法 - 不用担心性能,因为与等待文件更新相比,开放/尾部/关闭部分的时间非常短。如果您想要更高的效率,请在文件大小测试之间添加更长的延迟。它会以这种方式一次排出更多行,但不经常读取文件。

检查我的代码我最终使用了一个具有位置设置方法的FileChannel(FileInputStream.getChannel())。