Java 7目录监控问题

7
我刚刚看到了 Java 7 里面非常棒的功能,目录监视器。它可以在不轮询目录的情况下告诉你目录中的内容是否发生了变化。
1.) 但是它说如果文件系统不支持注册更改事件,则会回退到轮询。所有典型的 Linux 和 Windows 文件系统(extX、ntfs、reiserXXX、jsf、zfs)都支持这个功能吗?
2.) 在目录中重命名文件是一次创建事件还是一次变更事件?或者是一次删除和一次创建?我可以在一个系统上测试它,但对于所有文件系统都一样吗?
2个回答

2

看起来你正在谈论WatchService

ENTRY_CREATE事件的措辞表明,如果在目录中创建了一个新文件或重命名了一个文件,则会感知到新条目。它缺乏说明如果文件被重命名并仍然在同一个目录中,会触发哪些事件。

措辞还指出,服务是基于操作系统还是轮询取决于具体实现。我怀疑这是JRE的具体实现,因此即使你知道某个特定的操作系统支持它,也不能保证服务将使用操作系统级功能或采用轮询。实际上,该服务不提供任何方法来告诉它是否完全使用轮询还是操作系统级功能。

API定义的操作也不像监听器那样工作。WatchService确实可以自动监视,但要获取发生的事件列表,仍然必须手动从服务中请求已看到的事件。它似乎没有提供任何钩子来在新事件存在时自动调用。


好的,但我认为您可以从Oracle下载的JRE将引导Windows和Linux。这就是我真正感兴趣的事情。但是操作系统和文件系统在此之前必须具有一些功能。您有任何关于Oracle JRE如何处理这个问题的想法吗? - Franz Kafka
1
inotify 是 Linux 工具,用于在文件更改时提供通知。Windows 也有类似的服务:FindFirstChangeNotification 在 .NET 中可用。我不知道 Oracle JRE 如何处理它,但我想如果它们可用,它会通过 JNI 重定向到其中之一。 - Atreys

1

如果你在Windows和Linux上使用它,你会看到很多行为上的差异。因此,Java并没有真正尝试提供一致的平台无关抽象。你必须在你关心的操作系统上测试你的应用程序(好吧,只有两个)。

WatchService比你想象的更糟糕。如果你真的深入其中,准备好面对挫折。


好的,我会记住的。不用一直轮询目录看起来很高效。等了这么久才有这个功能,17天后它终于出现了。现在却变成垃圾了!?!希望它不会太糟糕 :-) - Franz Kafka
1
好的,我吓到你了。其实这个问题比起一开始想象的要复杂一些。 - irreputable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接