Java 7 WatchService - 忽略相同事件的多次出现

8 浏览
0 Comments

Java 7 WatchService - 忽略相同事件的多次出现

StandardWatchEventKinds.ENTRY_MODIFY的javadoc说:

目录条目被修改。当一个目录被注册到这个事件时,当观察到目录中的条目被修改时,WatchKey将被放入队列中。该事件的计数为1或更多。

当你通过编辑器编辑文件内容时,它会同时修改日期(或其他元数据)和内容。因此,你会得到两个ENTRY_MODIFY事件,但是每个事件的count都为1(至少我是这样看到的)。

我正在尝试监控一个通过命令行vi手动更新的配置文件(之前使用WatchService注册过的servers.cfg文件),代码如下:

while(true) {
    watchKey = watchService.take(); // 阻塞
    for (WatchEvent event : watchKey.pollEvents()) {
        WatchEvent watchEvent = (WatchEvent) event;
        WatchEvent.Kind kind = watchEvent.kind();
        System.out.println(watchEvent.context() + ", count: "+ watchEvent.count() + ", event: "+ watchEvent.kind());
        // 打印结果(在while循环中执行两次):
        // servers.cfg, count: 1, event: ENTRY_MODIFY
        // servers.cfg, count: 1, event: ENTRY_MODIFY
        switch(kind.name()) {
            case "ENTRY_MODIFY":
                handleModify(watchEvent.context()); // 重新加载配置文件
                break;
            case "ENTRY_DELETE":
                handleDelete(watchEvent.context()); // 执行其他操作
                break;              
        }
    }   
    watchKey.reset();       
}

由于会得到两个ENTRY_MODIFY事件,上述代码会在只需要一次的情况下重新加载配置两次。有没有办法忽略除了一个以外的所有事件,假设可能会有多个这样的事件?

如果WatchService API有这样的工具就更好了。(我不太想在每个事件之间检查时间戳。我的代码中的所有处理方法都是同步的)

如果从一个目录复制/粘贴文件到被监视的目录中,会出现相同的情况。如何将这两个事件合并成一个事件?

0