版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
转载请注明出处:https://blog.csdn.net/l1028386804/article/details/100991311
JDK7中的WatchService能够实现文件变更监听,使用示例如下代码所示:
package com.binghe.jdk7.listener;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.List;
/**
* 测试JDK的WatchService监听文件变化
* @author binghe
*
*/
public class Watcher {
public static void main(String[] args) throws IOException {
// 需要监听的文件目录(只能监听目录)
String path = "d:/test";
WatchService watchService = FileSystems.getDefault().newWatchService();
Path p = Paths.get(path);
p.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_CREATE);
Thread thread = new Thread(() -> {
try {
while(true){
WatchKey watchKey = watchService.take();
List<WatchEvent<?>> watchEvents = watchKey.pollEvents();
for(WatchEvent<?> watchEvent : watchEvents){
WatchEvent.Kind<?> kind = watchEvent.kind();
System.out.println("当前的文件为:" + path+"/"+watchEvent.context() + ", 进行的操作类型为:" + kind);
if (kind == StandardWatchEventKinds.ENTRY_CREATE) {
System.out.println("新建文件: "+watchEvent.context()+" 次数: " + watchEvent.count());
} else if (kind == StandardWatchEventKinds.ENTRY_DELETE) {
System.out.println("删除文件: "+ watchEvent.context()+", 次数: " + watchEvent.count());
} else if (kind == StandardWatchEventKinds.ENTRY_MODIFY) {
System.out.println("修改文件: "+watchEvent.context()+", 次数: " + watchEvent.count());
} else if (kind == StandardWatchEventKinds.OVERFLOW) {
System.out.println("overflow: "+watchEvent.context()+", 次数: " + watchEvent.count());
}
}
watchKey.reset();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
thread.setDaemon(false);
thread.start();
// 增加jvm关闭的钩子来关闭监听
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
watchService.close();
} catch (Exception e) {
}
}));
}
}