在Java中尾随/轮询日志文件的最有效方法[重复]
Posted
技术标签:
【中文标题】在Java中尾随/轮询日志文件的最有效方法[重复]【英文标题】:Most efficient way to tail/poll a log file in Java [duplicate] 【发布时间】:2012-04-12 06:11:51 【问题描述】:有很多方法,可以使用创建程序并调用Unix tail
命令,但是这样做的问题是该进程必须安装在安装了tail 的Unix 机器上。
另一种选择是逐行读取文件,直到没有更多行,休眠一段时间,然后尝试读取下一行并重复。
问题是我如何/如何轮询正在写入的文件。 AFAIK在文件被修改时无法在Java中获取异步通知,因为这太低级(来自操作系统的东西)。我也知道没有支持这一点的库。
我在想更好的方法可能是在文件的修改日期休眠/轮询..?
有什么解决办法吗?
【问题讨论】:
【参考方案1】:如果您可以使用 Java 7,则有 File Watchers,您可以实现所需的功能。File Notifications
对于 Java 6(和之前的版本),您必须使用 Apache Commons VFS (File Monitor) lib 来创建您自己的文件观察器。
如果您不能使用 Java 7 或使用第三方库(例如 commons 或 jnotify),您将不得不使用轮询线程自己编写一个文件看门狗。
【讨论】:
我怀疑文件通知仅用于添加和删除条目。有一个 ENTRY_MODIFY 但我认为它只是更改了目录条目而不是文件长度。【参考方案2】:如果文件/目录发生更改,您可以使用java nio's WatchService 获取异步通知。这个tutorial 解释了它的使用方法。
【讨论】:
Java 7,在这种情况下不能使用它,但很好的建议。【参考方案3】:您可以做些什么来简化这一点,即创建一个线程来轮询文件的大小并且只读取那么多,即它永远不会到达结尾。读取的数据可以写入管道,使您的主线程可以读取连续管道。
【讨论】:
【参考方案4】:我不知道答案。只有两个提示 1. 也许 RandomAccessFile 会帮助你。 2. 尝试找到另一个开源程序,它可以做到这一点。 (例如,IntelliJ IDEA 就是这样做的)
【讨论】:
以上是关于在Java中尾随/轮询日志文件的最有效方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章