您的位置:首页 > 运维架构

WatchService监控文件变化

2017-05-22 21:02 309 查看

概述

Java 7 对原有的NIO进行了重大的改进,新增了Path接口(和平台无关的路径),还有Paths,Files两个工具类。好了进入正题WatchService,在前面的Java版本中,如果想监控某个文件的变化,需要启动一个后台进程,每隔一段时间去遍历指定的目录,如果结果和上次的不同则认为发生了变化。而WatchService在这方面有更好的性能,但是需要结合Path类的register方法来使用。register方法的第一个参数需要制定一个WatchService来进行监听,后面为可选参数,指定的是需要监听哪些事件。

代码实现

import java.io.IOException;
import java.nio.file.FileSystems;
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;

public class WatchServiceTest {

public static void main(String[] args) throws InterruptedException {
try {
//得到一个实例
WatchService watcher = FileSystems.getDefault().newWatchService();
//结合Path的register方法来监控目录 C:\Users\Administrator\Desktop\123456\
Paths.get("C:\\Users\\Administrator\\Desktop", "123456")
.register(watcher, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY);
while(true){
WatchKey key = watcher.take();
for(WatchEvent<?> event : key.pollEvents()){
String ev = event.context()+"";
if("ENTRY_CREATE".equals(event.kind()))
System.out.println(ev+ " 文件 " + "创建了");
else if("ENTRY_MODIFY".equals(event.kind()+""))
System.out.println(ev+ " 文件--"+ "被修改了");
else if("ENTRY_DELETE".equals(event.kind()+""))
System.out.println(ev+ " 文件 " + "被删除了");
}
//重设WatchKey
boolean vaild = key.reset();
if(!vaild)
break;
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}


总结

虽然可以简单实现了文件的监控,但需要注意,如果修改文件名,会先触发delete事件,再触发modify事件;如果在该目录下有其他文件夹,在子文件夹中发生的一切事件都被认为是被监控的目录下的modify事件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息