我有一个程序使用WatchService
监视目录以进行文件更新。
我修改文件时会收到事件。但是,我注意到即使我在vi中打开文件,并且不修改其内容,也会调用监视服务poll
方法。
我的代码如下:
watcher = FileSystems.getDefault().newWatchService();
Path path = Paths.get("conf");
path.register(watcher, ENTRY_MODIFY);
WatchKey key = null;
key = watcher.poll(MAX_WAIT_TIME, TimeUnit.SECONDS);
if (key != null) {
for (WatchEvent<?> events : key.pollEvents()) {
WatchEvent<Path> ev = cast(events);
Path fileName = ev.context();
}
在上面的代码中,watcher.poll等待MAX_WAIT_TIME
个ENTRY_MODIFY
事件。但是,当我在被监视的目录中打开一个文件并关闭而不更改其内容时...... watcher.poll
收到一个事件并停止等待。
是否有一些需要设置的参数而我错过了?
答案 0 :(得分:1)
如果在关闭之前保存文件,操作系统会将文件视为已修改,即使没有更改,也会触发ENTRY_MODIFY事件。 您的代码也只占用一个表键。如果你想继续观看目录,你需要将watcher.poll指令放入循环中。
答案 1 :(得分:1)
我在java7中尝试了以下代码,它在windows中运行正常。请尝试使用watchkey重置选项.Below是用于WatchService的代码:
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.nio.file.StandardWatchEventKinds;
public class WatchServiceJava7Feature {
public static void main(String[] args) throws Exception {
System.out.println("here ");
WatchService watchService = FileSystems.getDefault().newWatchService();
Path path= Paths.get("C:\\User\\code\\watchservice\\");
System.out.println("here 1");
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,StandardWatchEventKinds.ENTRY_DELETE,StandardWatchEventKinds.ENTRY_MODIFY);
while(true)
{
WatchKey key = watchService.take(); // this will return the keys
for(WatchEvent<?> event : key.pollEvents())
{
WatchEvent<Path> watchEvent = (WatchEvent<Path>) event;
WatchEvent.Kind<Path> kind = watchEvent.kind();
switch(kind.name()) {
case "ENTRY_MODIFY":
System.out.println("Case Modify :Event on "+ event.context().toString() + " is "+ kind);
break;
case "ENTRY_DELETE":
System.out.println("Case Delete :Event on "+ event.context().toString() + " is "+ kind);
break;
case "ENTRY_CREATE":
System.out.println("Case Create :Event on "+ event.context().toString() + " is "+ kind);
break;
}
}
key.reset();
}
}
}