将新文件添加到监视文件夹时,Java NIO监视服务创建了"ENTRY_CREATE"和"ENTRY_MODIFY"

akn*_*non 9 java nio watchservice

我使用java.nio.file.WatchService看到一个奇怪的行为(不确定我是预期的行为).

问题是我在WatchService中注册了一个文件夹.当我将一个新文件复制到这个文件夹中时,会生成两个WatchEvent,每个一个用于:

'ENTRY_CREATE'和'ENTRY_MODIFY'.

据我所知,一个新文件(从其他未被监视的目录复制)必须只创建一个事件,即:'ENTRY_CREATE'.

任何人都可以解释为什么会创建额外的事件'ENTRY_MODIFY'吗?

我的代码:

public void watch() {
    WatchKey key = watcher.poll();

    //log.info("Watcher scheduler running. Watch key {}", key.hashCode());

    if (key != null) {
        Workflow workflow = keys.get(key);
        log.info("Runing watcher for key '{}'  and workflow {}", key.hashCode(), workflow.getName());
        File hotFolder = new File(workflow.getFolderPath());
        Path dir = hotFolder.toPath();

        for (WatchEvent<?> event : key.pollEvents()) {
            WatchEvent<Path> ev = cast(event);
            Path name = ev.context();
            Path child = dir.resolve(name);

            log.info("Polling event for name {} and child {} and dir {}", name.toFile(), child.toFile(), dir.toFile());

            if (Files.isDirectory(child, LinkOption.NOFOLLOW_LINKS))
                continue;

            try {
                switch (event.kind().name()) {
                case "ENTRY_CREATE":
                    log.info("New file {}", child.toFile());
                    fileService.processNewFile(child.toFile(), workflow);
                    break;
                case "ENTRY_MODIFY":
                    log.info("File modified.... {}", child.toFile());
                    fileService.processModifiedFile(child.toFile(),
                            workflow);
                    break;
                default:
                    log.error("Unknown event {} for file {}", event.kind()
                            .name(), child.toFile());
                    break;
                }
                // Operation op = Operation.from(event.kind());
                // if (op != null)
                // publisher.publishEvent(new FileEvent(child.toFile(),
                // workflow, op));
            } catch (Throwable t) {
                log.warn("Error while procesing file event", t);
            }
        }

        key.reset();
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,当我复制一个文件时,比如name ="abc.txt",日志会显示:
新文件abc.txt
文件已修改.... abc.txt


任何投入都是高度征求的.

小智 5

检查WatchService JavaDoc中的“平台依赖项”部分。

观察者在您描述的情况下行为正常。严格来说,当您将文件复制到文件夹时,文件实际上是创建然后修改的。

使用WatcherService时需要考虑很多事情,例如,它的行为差异很大:

  • 操作系统
  • 加密光盘
  • 网络共享
  • ...