我在Java OSGi服务中使用Apache JCI的FAM(FileAlterationMonitor)来监视和处理FileSystem中的更改。除了每次启动服务(使用下面的代码启动FAM)之外,一切似乎都运行得很好,FAM会选择目录中存在的所有更改。
目前我在看/ tmp / tmp包含一个子树:/ tmp / foo / bar / cat / dog
每当我启动服务并启动FAM时,它都会报告DirectoryCreate事件:
/tmp/foo
/tmp/foo/bar
/tmp/foo/bar/cat
/tmp/foo/bar/cat/dog
即使没有对该子树的任何部分进行任何更改。
代码在服务激活时运行:
File watchFolder = new File("/tmp");
watchFolder.mkdirs();
fam = new FilesystemAlterationMonitor();
fam.setInterval(1000);
fam.addListener(watchFolder, listener);
fam.start();
// I've already tried adding:
listener.waitForFirstCheck();
听众示例:
private FileChangeListener listener = new FileChangeListener() {
public void onDirectoryChange(File pDir) { System.out.println(pDir.getAbsolutePath()); }
public void onDirectoryCreate(File pDir) { System.out.println(pDir.getAbsolutePath()); }
...
}
答案 0 :(得分:1)
是的,这是JCI的一个非常烦人的功能。监控开始后,它会通过调用onXxxCreate()
通知您找到的所有文件和目录。我认为你有以下选择
FileChangeListener
回调实现中等待一段时间(几秒钟)。这就是我在一个项目中所做的,它运作得相当好,尽管你有可能错过了在“宽限期”内发生的实际文件创建。onDirectoryFound(File)
和onFileFound(File)
,只有在监控启动时找到文件和目录时才会触发它们java.nio.file.WatchService
IMO是最佳选择,因为它在内部使用本机方法,以便通知操作系统的更改,而不是启动线程并定期检查。使用JCI,您可能会在几秒钟的范围内出现延迟,直到更改传播到您的回调答案 1 :(得分:0)
忘记WatchService。它不直观,在尝试查看是否可以检测到正在监视的文件夹被删除或更改时存在问题。我会远离它。我曾与Watcher合作,但更喜欢Apache IO。我相信Camel也使用它。