我刚刚看到了 java 7 的一个很棒的功能,即目录观察器。它会在不轮询目录的情况下告诉您目录中何时发生更改。
1.) 但是它说如果文件系统不支持注册更改事件,它会退回到轮询。所有典型的 linux 和 windows 文件系统(extX、ntfs、reiserXXX、jsf、zfs)都支持这个功能吗?
2.) 重命名目录中的文件是创建事件还是更改事件?还是一删一建?我可以在一个系统上对其进行测试,但是对于所有文件系统来说是否都一样?
我刚刚看到了 java 7 的一个很棒的功能,即目录观察器。它会在不轮询目录的情况下告诉您目录中何时发生更改。
1.) 但是它说如果文件系统不支持注册更改事件,它会退回到轮询。所有典型的 linux 和 windows 文件系统(extX、ntfs、reiserXXX、jsf、zfs)都支持这个功能吗?
2.) 重命名目录中的文件是创建事件还是更改事件?还是一删一建?我可以在一个系统上对其进行测试,但是对于所有文件系统来说是否都一样?
看起来您在谈论WatchService。
ENTRY_CREATE事件的措辞表明,如果创建新文件或将文件重命名到目录中,则会感知到新条目。如果文件被重命名并保留在同一目录中,它缺乏对触发哪些事件的规范。
该措辞还指出,服务是基于操作系统还是轮询取决于实现。我怀疑这是由 JRE 实现的,因此即使您知道某个特定的操作系统支持它,也不能保证该服务将使用操作系统级别的功能或诉诸轮询。事实上,该服务根本没有提供任何方法来判断它是使用轮询还是操作系统级别的功能。
API 定义的操作也不像 Listener。WatchService 确实会自动监视,但要获取发生的事件列表,您仍然必须手动从服务请求看到的事件。它似乎没有提供任何挂钩来在出现新事件时自动调用。
如果您在 Windows 和 Linux 上使用它,您会发现很多不同的行为。所以 Java 并没有真正尝试提供一致的平台无关抽象。您必须在您关心的操作系统上测试您的应用程序(嗯,只有 2 个)。
WatchService 比你想象的还要糟糕。如果您真的投入其中,请为挫折做好准备。