大致原理: 通过配置监听器在web容器启动或销毁的时候做相应的操作, 系统目录的监听器使用从jdk1.7才有的WatchService
操作步骤: 1> 自定义自己的监听器实现ServletContextListener接口中的两个方法, 一个未初始化Init方法, 一个是销毁方法Destoryed,
由于WatchService为阻塞型方法, 所以需要新建线程防止web容器无法启动
1 package com.mtl.fill.listener; 2 3 4 import com.mtl.fill.utils.ListenFile; 5 6 import javax.servlet.ServletContextEvent; 7 import javax.servlet.ServletContextListener; 8 9 public class MyListener implements ServletContextListener { 10 @Override 11 public void contextInitialized(ServletContextEvent servletContextEvent) { 12 new Thread(new ListenFile()).start(); 13 } 14 15 @Override 16 public void contextDestroyed(ServletContextEvent servletContextEvent) { 17 18 } 19 20 }
2> 写出自己要执行的操作类, 因为用到了多线程, 所以继承Thread或者实现Runable接口
1 package com.mtl.fill.utils; 2 3 import java.io.*; 4 import java.nio.file.*; 5 6 public class ListenFile implements Runnable { 7 8 @Override 9 public void run() { 10 //获取文件系统的WatchService对象 11 WatchService watchService = null; 12 try { 13 watchService = FileSystems.getDefault().newWatchService(); 14 //为C:盘根路径注册监听 15 Paths.get("D://scai_client").register(watchService 16 //监听创建操作 17 , StandardWatchEventKinds.ENTRY_CREATE 18 //监听删除操作 19 ,StandardWatchEventKinds.ENTRY_DELETE 20 //监听修改操作 21 ,StandardWatchEventKinds.ENTRY_MODIFY); 22 //死循环一直监听 23 while(true) { 24 //一直等待,直到获取下一个文件变化事件 25 WatchKey key = watchService.take(); 26 //遍历监控获得的事件列表 27 for (WatchEvent<?> event : key.pollEvents()) { 28 //event.context()返回触发事件的文件或目录 29 System.out.println(event.context() + "发生了" + event.kind()+ "事件"); 30 } 31 //重新设置WatchKey 32 boolean valid = key.reset(); 33 //如果设置失败则退出监听 34 if (!valid) { 35 break; 36 } 37 } 38 } catch (IOException e) { 39 e.printStackTrace(); 40 } catch (InterruptedException e) { 41 e.printStackTrace(); 42 } 43 } 44 }
,这里directory监听引用了某位博主的博客, 但是找不到了, 所以抱歉无法报明出处了!