Java:监视目录中的更改

Java:监视目录中的更改,java,linux,directory,Java,Linux,Directory,我想创建一个侦听器来递归地检测目录更改(主目录及其子目录)。在一次web搜索之后,我发现了这篇文章,它解释了java.nio.file包中类WatchService的使用,该api完全满足了我的需求,但不幸的是,它仅在java 7中可用! 然后我再次返回搜索,以找到一个允许相同且兼容java 5和java 6的应用程序,但还是出现了一个问题,因为递归适用于Windows,我的应用程序应该使用Linux!! 你能给我一个解决方案吗:另一个框架,一种实现的方法。这是一种需要JVM或本机库支持的功能,

我想创建一个侦听器来递归地检测目录更改(主目录及其子目录)。在一次web搜索之后,我发现了这篇文章,它解释了java.nio.file包中类WatchService的使用,该api完全满足了我的需求,但不幸的是,它仅在java 7中可用! 然后我再次返回搜索,以找到一个允许相同且兼容java 5和java 6的应用程序,但还是出现了一个问题,因为递归适用于Windows,我的应用程序应该使用Linux!!
你能给我一个解决方案吗:另一个框架,一种实现的方法。

这是一种需要JVM或本机库支持的功能,比如你为Windows找到的那种。如果您在Java中找不到任何适用于Linux的,我建议您(在另一个问题中)询问一个二进制Linux库,然后在此基础上构建一个Java本机类


我希望其他人能更好地帮助你。

我认为你的发现工作做得很好,找到了一个很棒的图书馆jpathwatch。我不明白递归的问题是什么:我在这个库文档中没有看到linux的任何限制

但是,如果出于某种原因,jpathwatch不能在linux上帮助您,这不是问题:您可以自己运行du命令。见本参考资料:


如果我是你,我可能会做以下事情:编写简单的脚本,在循环中运行du。然后从单独的线程从java运行该脚本,该线程连续读取脚本的输出并对其进行分析

要在Linux上执行此操作,您需要使用Java 7,或者使用
inotify
的本机库。你考虑过这个问题吗?它看起来像是在处理子目录的递归,包括新创建的子目录。

看看

“java.nio.file包提供了一个名为“监视服务API”的文件更改通知API。该API使您能够注册一个或多个目录。”使用watch服务。注册时,您会告诉服务您感兴趣的事件类型:文件创建、文件删除或文件修改。当服务检测到感兴趣的事件时,它会转发到注册的进程。注册的进程有一个线程(或线程池)专用于监视已注册的任何事件。当事件进入时,将根据需要进行处理。”


更新:哦,刚刚意识到你已经看到了。我没有意识到这只是在Java 7中:-(

如果您链接的框架只适用于一个文件,那么让它在子文件夹中重复工作应该不是一个大问题,或者是吗?为什么人们总是害怕升级到最新的Java版本?因为Java 7发布了编译器优化错误?可能是@AdrianCox的重复:这不是一个有效的原因。JVM runtimes偶尔会有bug,甚至“稳定”一个。这个问题很快就会得到解决。这个链接解释说,监视子目录中的更改只适用于Windows运行
du
将导致大量磁盘IO,并且不会检测到不修改文件大小的更改。没错。如果不更改文件大小,du也没有帮助。我只是想提供解决方法.Ooops,刚刚意识到您已经看到了这一点。我不知道这只是在Java 7中:-(