【问题标题】:java 7 directory monitoring questionsjava 7 目录监控问题
【发布时间】:2011-06-11 10:12:05
【问题描述】:

我刚刚看到了 java 7 的一个很棒的功能,即目录观察器。它会告诉您目录中的某些内容何时发生更改,而无需轮询目录。

1.) 但它表示如果文件系统不支持注册更改事件,它会退回到轮询。所有典型的 linux 和 windows 文件系统(extX、ntfs、reiserXXX、jsf、zfs)都支持这个功能吗?

2.) 重命名目录中的文件是创建事件还是更改事件?还是一删一建?我可以在一个系统上测试它,但所有文件系统都一样吗?

【问题讨论】:

    标签: java directory monitoring registration java-7


    【解决方案1】:

    您似乎在谈论WatchService

    ENTRY_CREATE 事件的措辞表示,如果创建新文件或将文件重命名到目录中,则会感知到新条目。如果文件被重命名并保留在同一目录中,它缺乏对触发哪些事件的规范。

    该措辞还指出,服务是基于操作系统还是轮询取决于实现。我怀疑这是由 JRE 实现的,因此即使您知道某个特定的操作系统支持它,也不能保证该服务将使用操作系统级别的功能或诉诸轮询。事实上,该服务根本没有提供任何方法来判断它是使用轮询还是操作系统级别的功能。

    API 定义的操作也不像 Listener。 WatchService 确实会自动监视,但要获取发生的事件列表,您仍然必须手动从服务请求看到的事件。它似乎没有提供任何挂钩来在出现新事件时自动调用。

    【讨论】:

    • 好的,但我认为您可以从 oracle 下载的 JRE 将引领 windows 和 linux 的发展方向。这就是我真正感兴趣的。但是操作系统和文件系统在此之前仍然必须具有一些功能。 oracle jre 处理这个问题的任何想法?
    • inotify 是一个 linux 工具,可在文件更改时提供通知。 Windows 也有这样的服务:FindFirstChangeNotification 在 .NET 中可用。我不知道 oracle jre 如何处理它,但我想如果它们可用,它会通过 jni 重定向到其中一个。
    【解决方案2】:

    如果您在 Windows 和 Linux 上使用它,您会发现很多不同的行为。所以 Java 并没有真正尝试提供一致的平台无关抽象。您必须在您关心的操作系统上测试您的应用(嗯,只有 2 个)。

    WatchService 比你想象的还要糟糕。如果您真的投入其中,请做好挫折的准备。

    【讨论】:

    • 好的,我会记住这一点。不必一直轮询目录似乎非常有效。等待这样一个功能的时间很长,在 17 天内它就在那里。现在是废话!?!希望它不会太糟糕:-)
    • 好吧,我吓到你了。它比人们最初想象的要复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2015-09-19
    相关资源
    最近更新 更多