NIO +观察者模式 文件通知
2015-07-01 16:53
162 查看
package watchFile; /** * Created by 8pig-16 on 2015/7/1. */ public class Test { public static void main(String [] args){ UpdateFile updateFile=new UpdateFile(); updateFile.register(new UpdateFile.Update() { public void update(String file) { System.out.println("更新文件--"+file); } }); WatchDir watchDir= null; try { watchDir = new WatchDir(updateFile,"E:\\update"); Thread t=new Thread(watchDir); t.setDaemon(false); t.start(); } catch (Exception e) { e.printStackTrace(); } } }
package watchFile; import java.io.File; import java.io.IOException; import java.nio.file.*; import java.util.List; /** * Created by 8pig-16 on 2015/7/1. */ public class WatchDir implements Runnable{ private WatchService watchService; private UpdateFile updateFile; //监控某个目录下 public WatchDir(UpdateFile updateFile,String dir) throws Exception{ this.updateFile=updateFile; //Path path= FileSystems.getDefault().getPath(dir); Path path= Paths.get(dir); //获取默认的实现 watchService=FileSystems.getDefault().newWatchService(); //注册监听事件 path.register(watchService,StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY); } //该目录是否是正确的 private boolean isRightDir(String dir){ // 尝试找到配置文件路径 try { File file = new File(dir).getCanonicalFile(); } catch (Exception e) { e.printStackTrace(); } return false; } public void run() { System.out.println("start.."); while(true){ //循环接受事件 try { System.out.println("run.."); //获取事件类型 add delete modify WatchKey key=watchService.take(); System.out.println("key.."+key); //获取事件列表 List<WatchEvent<?>> events= key.pollEvents(); for(WatchEvent event:events){ WatchEvent.Kind kind = event.kind(); if (kind == StandardWatchEventKinds.OVERFLOW) {// 事件可能lost or discarded continue; } WatchEvent<Path> e = (WatchEvent<Path>) event; Path fileName = e.context(); // 通知这些变化的 String configFile = String.valueOf(fileName); //通知观察者 updateFile.notifyInterface(configFile); // System.out.printf("Event %s has happened,which fileName is %s%n", kind.name(), fileName); // break; } if (!key.reset()) { break; } } catch (InterruptedException e) { e.printStackTrace(); } } } }
package watchFile; import java.util.ArrayList; import java.util.List; /** * Created by 8pig-16 on 2015/7/1. */ public class UpdateFile { private List<Update> updates=new ArrayList<Update>(); public void register(Update update){ updates.add(update); } public void delete(Update update){ updates.remove(update); } public void notifyInterface(String fileName){ for (Update update:updates){ update.update(fileName); } } public interface Update{ public void update(String file); } }
相关文章推荐
- 传入字符串,计算字符串长度(用指针实现)
- 浅析linux系统函数调用的工作机制
- 面试资料整理
- [iOS]swift版内购
- UNIX网络进程间通信漫谈(1)
- Ninject简介(转)
- JAVA类加载机制
- 序列化与反序列化
- 【Linux 内核网络协议栈源码剖析】bind 函数剖析
- 泛型
- 关于GRE阅读难句备考的五个要点
- android style.xml的使用
- 文件上传下载
- iOS开发笔记23——iOS工程结构
- 【数据结构】排序
- Android] Android XML解析学习——方式比较
- WPF Multi-Touch 开发:高级触屏操作(Manipulation)
- linux服务分类---rpm和源码包服务安装的区别
- Google API相关
- windows命令提示符不能输入中文怎么办?