背景
我们在用IDE写代码,或者某些文本编辑器的时候,在外部如果修改了这个文件,通常这些编辑器都能感知到,有些还会提示你是否要重新加载,例如notepad :
这些特性都是基于文件系统的文件变化通知实现的。我们可以通过一些方式监控某些文件或者文件夹的变化,但是很难做到Scalable
Java7之后的NIO2包的WatchService提供了一种Scalable的方式监控文件与文件夹变化
代码解析
代码语言:javascript复制public class WatchServiceFirst {
public static void main(String[] args) throws IOException, InterruptedException {
WatchService watchService = FileSystems.getDefault().newWatchService();
Path path = Paths.get("D:\apache-jmeter-3.3\bin");
//注册需要监听的事件
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.OVERFLOW);
WatchKey key;
while ((key = watchService.take()) != null) {
for (WatchEvent event : key.pollEvents()) {
System.out.println(
"Event kind:" event.kind()
". File affected: " event.context() ".");
}
key.reset();
}
}
}
四种监听事件:
StandardWatchEventKinds.ENTRY_CREATE | 文件创建 |
---|---|
StandardWatchEventKinds.ENTRY_DELETE | 文件删除 |
StandardWatchEventKinds.ENTRY_MODIFY | 文件修改 |
StandardWatchEventKinds.OVERFLOW | 事件丢失,一般不关注 |
这里的event.context()是相对路径并且,只能监控当前目录下的,也就是说你在其中一个子目录下创建文件或者文件夹,都是只会返回这个目录的修改事件。