实现一个相当于tail -f somefile
我读过几个类似的问题。我看到了一些选择。
使用BufferedReader
,基本思路是使用缓冲读取器从文件中读取。如果返回null,则休眠几秒钟,然后继续无限循环。我对此进行了实验,我的结果显示只要您读到文件的末尾,然后getLine
方法将不再为您提供任何更新。那么这种方法有用吗?
使用random access file
。每次进行读取操作,创建随机访问文件并将文件长度与历史长度进行比较,如果当前文件长度较长,则寻找最后读取和读取增量部分。我确定这有效,但每次阅读时都会打开一个新的随机访问文件,是不是有更有效的方法?
我已经看到新的JDK将stream
API添加到缓冲文件阅读器中,我想这与后面附加的新内容无关。它只与最初给出的内容相关。我的问题是,可以将此流API扩展为考虑tailer function
吗?
问题:
可以BufferedReader
用于实施tail -f
吗?在我的情况下,一旦我读取了通过EOF,只返回null。
可以使用JDK8 stream
来实现tail -f
吗?
除了像apache common lib这样重复打开关闭文件之外,还有更高效的实现吗?
答案 0 :(得分:0)
我最终使用了一些Apache库来解决这个问题。 (一旦我记得它就会更新。)
基本上文件监视器依赖于文件系统API。在Linux发行版上,读取EOF可能会很好并带来后来附加的新内容。
我观察到的问题出现在MACO上,一旦你在EOF之后阅读文件处理程序不再有效。如果您知道正在阅读新内容,则必须重新打开该文件。
less /F
tail -f
。 答案 1 :(得分:-1)
我之前做过这个,根据我的经验,我猜你的问题可能没什么问题 - 在读取之间关闭文件或使用Apache Tailer类可能更好,就像我在类似的问题中建议的那样:
这不仅有助于您帮助您刷新,还可以防止文件在您阅读时被锁定。
我最终没有使用它(因为在我的环境中获得批准的软件具有挑战性) - 相反,我选择使用这样的过程:
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())。