Java 有没有一种使用WatchService强制轮询的方法?

Java 有没有一种使用WatchService强制轮询的方法?,java,nio,polling,Java,Nio,Polling,我有一个工作代码,它使用WatchService监听目录并响应我指定的事件。这很好,并且已经在linux和mac上进行了测试(尽管在mac上很明显使用了轮询) 然而,当我在生产环境中部署它时,发现被监视的目录是一个NFS挂载。由于WatchService在linux上运行时使用inotify,因此从未触发任何事件,因为NFS装载不会触发inotify事件(或者类似的内容,这里有更多信息,可以解释我的问题:) 因为我的代码已经编写好了,我宁愿强制WatchService使用轮询实现,而不是inot

我有一个工作代码,它使用WatchService监听目录并响应我指定的事件。这很好,并且已经在linux和mac上进行了测试(尽管在mac上很明显使用了轮询)

然而,当我在生产环境中部署它时,发现被监视的目录是一个NFS挂载。由于WatchService在linux上运行时使用inotify,因此从未触发任何事件,因为NFS装载不会触发inotify事件(或者类似的内容,这里有更多信息,可以解释我的问题:)

因为我的代码已经编写好了,我宁愿强制WatchService使用轮询实现,而不是inotify实现。有办法做到这一点吗

我试图通过查找sun.nio.fs.PollingWatchService源代码并直接创建一个对象(而不是使用FileSystems.getDefault().newWatchService())来实现这一点,但在使用路径注册服务时,我遇到了以下异常:java.nio.file.ProviderMismatchException


有什么想法吗?因为我已经使用WatchService和WatchKey API实现了代码,所以强制轮询要比使用自定义或第三方轮询器重写所有内容容易得多。谢谢

您可以尝试开源项目jpoller。它实现了一个名为DirectoryPoller的类,该类定期轮询一个或多个目录的内容。 它是一个周期性线程,使用上次修改文件时查找新文件。 要下载源代码,您可以访问
老实说,我没有使用jpoller。我使用了JDK 7 WatcherService事件。

我们遇到了类似的问题,决定放弃使用WatcherService。有几个库实现了池。我建议使用Apache Commons IO监视器:


这是一种缓慢而低效的方式,但是
File f=new文件(您的目录“\u garbage.tmp”);新建FileOutputStream(f).close();f、 删除()
只需收听名为
“\u garbage.tmp”
?@k\u g:谢谢您的回复,但我不知道这有什么帮助。你能详细说明一下吗?如果你创建一个文件然后删除它,它应该会触发一个WatchService事件,对吗?@k_g:是的,但关键是WatchService在映射驱动器上不起作用。我只是想问,我们是否可以强制它使用轮询实现,而不只是获取平台支持的任何东西(因为此实现并不适用于所有文件系统)。您是否成功地扩展了AbstractWatchService并基于PollingWatchService创建了自己的实现?