java - Java监视服务在将新文件添加到监视文件夹时创建'ENTRY_CREATE'和'ENTRY_MODIFY'

  显示原文与译文双语对照的内容

我看到了( 不确定这是不是预期的行为) 使用 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();


 }


}



因此,当我复制文件时,如 name =" abc.txt",日志显示:
新建文件 abc.txt
文件修改。abc.txt


任何输入都被要求。

时间: 原作者:

检查 WatchService的"平台依赖关系"中的部分。

观察者在你所描述的情况下工作正常。 严格来说,当你将文件复制到文件夹时,文件真正被创建并被修改。

使用WatcherService时需要考虑很多事情,例如它的行为有很多变化:

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