Java 7 WatchService--打开文件时触发条目\修改

Java 7 WatchService--打开文件时触发条目\修改,java,watchservice,Java,Watchservice,我有一个程序,可以使用WatchService监视目录以进行文件更新。 我在修改文件时获取事件。但是,我注意到,即使我在vi中打开一个文件,并且不修改其内容,也会调用watch服务poll方法。 我的代码如下: watcher = FileSystems.getDefault().newWatchService(); Path path = Paths.get("conf"); path.register(watcher, ENTRY_MODIFY); WatchKey key = null;

我有一个程序,可以使用
WatchService
监视目录以进行文件更新。 我在修改文件时获取事件。但是,我注意到,即使我在vi中打开一个文件,并且不修改其内容,也会调用watch服务
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=FileSystems.getDefault().newWatchService();
Path=Path.get(“conf”);
路径寄存器(观察者、条目\修改);
WatchKey=null;
key=watcher.poll(最大等待时间,时间单位为秒);
if(key!=null){
for(WatchEvent事件:key.pollEvents()){
WatchEvent ev=铸造(事件);
路径文件名=ev.context();
}
在上面的代码中,watcher.poll等待
MAX\u WAIT\u TIME
以查看
ENTRY\u MODIFY
事件。但是,当我打开被监视目录中的文件并关闭而不更改其内容时,
watcher.poll
接收到一个事件并停止等待。
是否有一些参数需要设置而我丢失了?

如果在关闭前保存文件,即使文件没有更改,操作系统也会将文件视为已修改,这将触发条目修改事件。
另外,您的代码只使用了一个监视键。如果您想继续监视目录,需要将watcher.poll指令放入循环。

我在java7中尝试了以下代码,在windows中效果良好。另外,请尝试watchkey重置选项。下面是用于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();  
                           }

                        }

                    }
导入java.nio.file.FileSystems;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.nio.file.WatchEvent;
导入java.nio.file.WatchKey;
导入java.nio.file.WatchService;
导入java.nio.file.StandardWatchEventTypes;
公共类WatchServiceJava7Feature{
公共静态void main(字符串[]args)引发异常{
System.out.println(“此处”);
WatchService WatchService=FileSystems.getDefault().newWatchService();
Path Path=Path.get(“C:\\User\\code\\watchservice\\”;
System.out.println(“此处1”);
注册(watchService、StandardWatchEventTypes.ENTRY\u创建、StandardWatchEventTypes.ENTRY\u删除、StandardWatchEventTypes.ENTRY\u修改);
while(true)
{
WatchKey key=watchService.take();//这将返回密钥
for(WatchEvent事件:key.pollEvents())
{
WatchEvent WatchEvent=(WatchEvent)事件;
WatchEvent.Kind Kind=WatchEvent.Kind();
开关(kind.name()){
案例“输入\修改”:
System.out.println(“Case Modify:Event on“+Event.context().toString()+”是“+kind”);
打破
案例“条目删除”:
System.out.println(“案例删除:“+Event.context().toString()+”上的事件是“+kind”);
打破
案例“条目创建”:
System.out.println(“Case Create:Event on“+Event.context().toString()+”是“+kind”);
打破
}         
}
键。重置();
}
}
}

我正在unix上运行我的程序。我在vi中打开一个文件并关闭它而不保存。一旦退出该文件,我就会看到watcher.poll从等待模式退出。我上面发布的是实际代码的一段,watcher.poll指令在循环中运行,并正确处理所有真正的修改事件。唯一的问题是它将退出即使文件在vi中被简单地打开,并且在没有修改的情况下关闭,也会触发事件。