Java 7 WatchService 对其他人来说很慢吗?

Posted

技术标签:

【中文标题】Java 7 WatchService 对其他人来说很慢吗?【英文标题】:Is Java 7 WatchService Slow for Anyone Else? 【发布时间】:2012-03-24 05:29:27 【问题描述】:

WatchService 看起来是一项很棒的技术,但它太慢了,无法在我测试过的 OS X 和 Linux 系统上使用。雪上加霜的是,它似乎也没有收到所有事件的通知。

我自己的代码和 Oracle 的规范示例都是这种情况。 (http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/essential/io/examples/WatchDir.java)

我知道 OS X OpenJDK 端口不确定此功能(请参阅https://wikis.oracle.com/display/OpenJDK/Mac+OS+X+Port+Project+Status)

有人在生产中成功使用它吗?

【问题讨论】:

自 2012 年以来这是一个非常烦人的known issue。 问题表明“OS X 和 Linux”,但答案和 cmets 似乎表明这只是 OS X 上的问题。 【参考方案1】:

如果我改变,我的响应时间会更好

folder.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);

folder.register(watcher, new WatchEvent.Kind[]StandardWatchEventKinds.ENTRY_MODIFY, SensitivityWatchEventModifier.HIGH);

【讨论】:

请注意 StandardWatchEventKinds 枚举位于 com.sun.* 包中。 是的!这就是我成功的原因,在我使用它之前,我有 4 到 5 秒的延迟。作为参考,我创建的脚本在这里:gist.github.com/DinisCruz-Dev/9214909 对我来说也是一样,我有至少 4 秒的延迟,这使它像在 Linux 或 Windows 上(通常)一样工作。非常感谢。 StandardWatchEventKinds 现在是 java.nio.file 包的一部分,尽管 SensitivityWatchEventModifier 仍属于 Sun 私有包。 @Paul 当然,但由于它是一个私有包,因此不能跨不同的 JVM 实现(例如 IBM 的实现)移植。【参考方案2】:

JDK 7 还没有适用于 MacOS 的 WatchService 的本机实现。它不是监听本机文件系统事件,而是使用备用 sun.nio.fs.PollingWatchService,它定期遍历文件系统并检查树中每个文件和子目录的最后修改时间戳。我还发现它非常慢。

Mac 有 WatchService 的原生实现:

http://code.google.com/p/barbarywatchservice/

我自己没试过用。

【讨论】:

在 JDK 8 for MacOS 中仍然是这种情况吗? @ben,显然是的。由于它非常慢并且没有选择所有事件,我们仍然遇到问题。 看来 JDK 9 也无法解决这个问题。该问题仍然存在bugs.openjdk.java.net/browse/JDK-7133447,并且在过去的邮件列表讨论中没有解决方案:mail.openjdk.java.net/pipermail/nio-dev/2014-August/002691.html。 警告! 我们想使用 BarbaryWatchService,但发现它与 HighSierra 上的 APFS 的行为不符。我在该项目上提出了issue。 Java 13 现在有变化吗?

以上是关于Java 7 WatchService 对其他人来说很慢吗?的主要内容,如果未能解决你的问题,请参考以下文章

WatchService 可能存在不能再window工作

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

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

java 使用Java WatchService观察目录

java 在Java WatchService上注册目录及其子目录

Java 文件系统监控(WatchService)