0

我有一个程序可以使用WatchService. 我在修改文件时收到事件。但是,我注意到即使我在 vi 中打开一个文件并且不修改其内容,poll也会调用 watch 服务方法。我的代码如下:

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接收到一个事件并停止等待。是否有一些参数需要设置而我错过了?

4

2 回答 2

1

如果在关闭之前保存文件,即使文件没有更改,操作系统也会看到文件已修改,并且这些将触发 ENTRY_MODIFY 事件。此外,您的代码只需要一个手表键。如果您想继续观看该目录,您需要将 watcher.poll 指令放入一个循环中。

于 2014-01-28T13:32:54.140 回答
1

我在 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();  
                           }

                        }

                    }
于 2016-12-23T17:11:09.693 回答