【发布时间】:2016-05-25 16:21:38
【问题描述】:
实现一个相当于tail -f somefile的java文件观察器
我读过一些类似的问题。我已经看到了一些选择。
使用
BufferedReader,基本思想是使用缓冲读取器从文件中读取。如果返回 null 然后休眠几秒钟,然后继续无限循环。我对此进行了一些实验,我的结果显示只要你读到文件末尾,那么getLine方法将不再给你任何更新。那么这种方法是否有效?使用
random access file。每次进行读取操作时,创建一个随机访问文件,并将文件长度与历史文件长度进行比较,如果当前文件较长,则寻求最后一次读取并在增量部分中读取。我确定这可行,但是每次读取时都会打开一个新的随机访问文件,难道没有更有效的方法吗?我看到新的 JDK 在缓冲文件阅读器中添加了
streamAPI,我想这与尾部附加的新内容无关。它只与最初给出的内容有关。我的问题是可以扩展这个流 api 以考虑tailer function吗?
问题:
BufferedReader可以用来实现tail -f吗?在我的情况下,一旦我读取通过 EOF,只会返回 null。JDK8
stream可以用来实现tail -f吗?除了像apache common lib这样反复打开关闭文件,还有没有更高效的实现方式?
【问题讨论】:
-
1 和 3 可能是最简单的,实际上它只是您的选择。如果您已经看到所有这些的实现,为什么要问?只需选择最吸引您的一个。我个人是用 groovy 做的。我用 def text=new File("tailFile.txt").text.split() 或类似的东西阅读了整个文件——你可以从你想要的“文本”中选择任何行。非常简单,如果内存不足我会重新编写它(到目前为止我还没有,因为我没有拖尾任何 10gb 文件。
-
ps,。您的问题被表述为命令。您是要我们选择其中一个选项还是给您一个完整的实现?
-
@BillK 正如我在选项 1/3 中所说,它是否有效?就我而言,读到最后,根本没有返回任何新内容。
-
您的
BufferedReader代码有问题。BufferedReader不保留读取之间的 EOF 状态。如果随后附加了数据,readLine()可以读取超出返回 NULL 的点。测试了很多次。