在Java中尾部/轮询日志文件的最有效方法

有很多方法,可以使用创建程序并只调用Unix tail命令,但问题是该进程必须安装在安装了尾部的Unix机器上。

另一种选择是直接读取文件,直到没有更多行,睡眠一段时间然后尝试读取下一行并重复。

问题是我如何/如何轮询正在写入的文件。 AFAIK在Java中没有办法在文件被修改时获得异步通知,因为这个级别太低(来自操作系统的东西)。 我也知道没有lib支持这个。

我在想一个更好的方法可能是在文件的修改日期进行睡眠/轮询..?

有解决方案?

如果您可以使用Java 7,那么可以使用File Watchers,您可以实现所需的function。
文件通知

对于Java 6(和之前的版本),您必须使用Apache Commons VFS( 文件监视器) lib来创建自己的文件监视器。

如果您不能使用Java 7或使用第三方库(例如,commons或jnotify ),则必须使用轮询线程编写一个监视程序。

如果文件/目录已更改,您可以使用java nio的WatchService来获取异步通知。 本教程介绍了使用它的方法。

你可以做些什么来简化这个是创建一个轮询文件大小的线程,只读取那么多,即它永远不会到达终点。 可以将此数据读取写入管道,允许主线程读取连续管道。

我不知道答案。 只有两个提示
也许RandomAccessFile可以帮到你。
2.尝试找到另一个开源程序,执行此操作。 (例如IntelliJ IDEA正是这样做的)