Apache JCI FilesystemAlterationMonitor在启动时处理现有文件夹内容的更改

时间:2011-12-22 20:47:24

标签: java filesystemwatcher apache-commons-jci

我在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()); }
    ...
}

2 个答案:

答案 0 :(得分:1)

是的,这是JCI的一个非常烦人的功能。监控开始后,它会通过调用onXxxCreate()通知您找到的所有文件和目录。我认为你有以下选择

  • 在开始监控之后,在实际处理来自JCI的事件之前,在FileChangeListener回调实现中等待一段时间(几秒钟)。这就是我在一个项目中所做的,它运作得相当好,尽管你有可能错过了在“宽限期”内发生的实际文件创建。
  • 获取JCI的来源并修改它们以使用两个新的事件方法onDirectoryFound(File)onFileFound(File),只有在监控启动时找到文件和目录时才会触发它们
  • 查看Java 7附带的java.nio.file.WatchService IMO是最佳选择,因为它在内部使用本机方法,以便通知操作系统的更改,而不是启动线程并定期检查。使用JCI,您可能会在几秒钟的范围内出现延迟,直到更改传播到您的回调

答案 1 :(得分:0)

忘记WatchService。它不直观,在尝试查看是否可以检测到正在监视的文件夹被删除或更改时存在问题。我会远离它。我曾与Watcher合作,但更喜欢Apache IO。我相信Camel也使用它。