使用 Java WatchService 监视文件夹中的文件夹

Posted

技术标签:

【中文标题】使用 Java WatchService 监视文件夹中的文件夹【英文标题】:Using a Java WatchService to monitor folders within folders 【发布时间】:2012-10-05 09:15:51 【问题描述】:

我正在尝试使用 Java 7 的 WatchService 来监控文件夹。我希望它监视添加到使用 WatchService 注册的路径的任何文件或文件夹。

如果我将文件夹添加到注册路径,它会正确检测为 ENTRY_CREATE 并在 watchEvent.context() 中返回文件夹的名称。但是,如果我向该文件夹中添加一个文件夹而不是再次检测到它,但 watchEvent.context() 返回相同的文件夹和 ENTRY_MODIFY,因为该文件夹已通过添加另一个文件夹进行了修改。

所以我理解这一点,但不知道我是否应该注册结构中的每个文件夹,或者只注册***文件夹并监听或创建和修改

【问题讨论】:

docs.oracle.com/javase/tutorial/essential/io/examples/… 应该很有用,它展示了如何通过遍历 FileTree 递归地添加 WatchKeys 【参考方案1】:

没有跨平台的直接支持。对于 Windows,有一个 ExtendedWatchEventModifier.FILE_TREE 将递归地监视一个目录。但是在 Mac 或 Linux 上没有等效的功能。另请注意,ExtendedWatchEventModifier 是一个扩展,而不是标准定义的一部分。

您必须聆听 CREATE 和 DELETE。当创建(删除)的对象是一个目录时,您需要在子目录上添加(删除)一个新的监视。

【讨论】:

谢谢,你的意思是jpathwatch.sourceforge.net。看起来它现在可能支持 OSX 但对我来说只注册每个文件夹似乎更安全 我相信大部分 WatchService 概念都源自于此。但它也是 OpenJDK7 的一部分:docjar.com/html/api/com/sun/nio/file/… 请注意,这是一个 com.sun.* 类。 我在 jdk.unsupported 库中找到了 ExtendedWatchEventModifier,至少从 Java 10 开始。

以上是关于使用 Java WatchService 监视文件夹中的文件夹的主要内容,如果未能解决你的问题,请参考以下文章

哪些操作系统支持 Java 中的本机(类似 inotify)文件监视

Java 文件系统监控(WatchService)

Java目录事件

java 使用Java WatchService观察目录

Java WatchService 在观看映射驱动器时不生成事件

Java 项目中一种简单的动态修改配置即时生效的方式 WatchService