Watch service 用来观察被注册了的对象的变化和事件。例如,在文件系统监控某一个文件目录下文件资源的创建,修改,删除,这个是WatchService的一种实现方式,用来监听文件状态变化的。是WatchService和Watchable两个接口的配合使用,WatchService类似于在观察者模式中的观察者,Watchable类似域观察者模式中的被观察者。
实例如下:
@Test
public void testResourceChanged() throws IOException, InterruptedException, ExecutionException {
final String pathName = ResourceChangedTest.class.getResource("./").getPath();
// 文件监控线程
Executors.newCachedThreadPool().submit(new Runnable() {
public void run() {
try {
WatchService watchService = FileSystems.getDefault().newWatchService();
Path path = Paths.get(pathName);
// 注册监听器
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE);
while (true) {
// 阻塞方式,消费文件更改事件
List<WatchEvent<?>> watchEvents = watchService.take().pollEvents();
for (WatchEvent<?> watchEvent : watchEvents) {
System.out.printf("[%s]文件发生了[%s]事件。%n", watchEvent.context(), watchEvent.kind());
}
}
} catch(Exception e) {}
}
});
Thread.sleep(1000);
Path path2 = Paths.get(pathName + "test.xml");
File file = path2.toFile();
file.createNewFile();// 新建文件
file.delete();// 删除文件
Thread.sleep(1000);
}
输出结果:
[test.xml]文件发生了[ENTRY_CREATE]事件。
[test.xml]文件发生了[ENTRY_DELETE]事件。
[test.xml]文件发生了[ENTRY_DELETE]事件。