2011-06-11 65 views
7

我刚刚看到了java 7的一个很棒的功能,目录监视器。它会告诉你什么时候在目录中进行了某些更改而不轮询该目录。java 7目录监控问题

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

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

回答

2

看起来您正在谈论WatchService

ENTRY_CREATE事件的措辞表明,如果创建新文件或将文件重命名到目录中,则会感觉到新条目。它缺少关于如果文件被重命名并保持在同一目录中的情况下触发什么事件的规范。

该措辞还指出,该服务是基于操作系统还是轮询是依赖于实现的。我怀疑这是由JRE实现的,因此即使您知道特定的操作系统支持它,也不能保证该服务将使用操作系统级别的功能或采用轮询。实际上,该服务不提供任何方式来判断它是否使用轮询或操作系统级功能。

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

+0

没关系,但我认为可以从oracle下载的JRE将引领windows和linux。这就是我真正感兴趣的。但是,在操作之前,操作系统和文件系统必须具备一些功能。 oracle jre处理的任何想法? – 2011-06-11 11:49:04

+1

[inotify](http://en.wikipedia.org/wiki/Inotify)是一个Linux工具,可在文件更改时提取通知。 Windows也有这样的服务:[FindFirstChangeNotification](http://msdn.microsoft.com/en-us/library/aa364417%28VS.85%29.aspx)在.NET中可用。我不知道oracle jre如何处理它,但我想如果它们可用,它会通过jni重定向到其中的一个。 – Atreys 2011-06-11 12:00:46

1

如果您在Windows和Linux上使用它,您会看到很多行为差异。所以Java并没有真正尝试提供一致的平台独立抽象。您必须在您关心的操作系统上测试您的应用程序(当然,只有2个)。

WatchService超出您的想象。如果你真的潜入其中,准备感到沮丧。

+0

好的,我会记住这一点。看起来非常高效,不必一直轮询目录。等待这样一个功能的时间,在17天内它在那里。现在它是废话!?!希望它不会太难:-) – 2011-06-11 20:17:25

+1

好吧我吓到你太多了。这只是比最初想象的更复杂。 – irreputable 2011-06-11 23:42:36