大致原理: 通过配置监听器在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 ????@Override11 ????public void contextInitialized(ServletContextEvent servletContextEvent) {12 ????????new Thread(new ListenFile()).start();13 ????}14 15 ????@Override16 ????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(watchService16 ????????????????????//监听创建操作17 ????????????????????, StandardWatchEventKinds.ENTRY_CREATE18 ????????????????????//监听删除操作19 ????????????????????,StandardWatchEventKinds.ENTRY_DELETE20 ????????????????????//监听修改操作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 ????????????????//重新设置WatchKey32 ????????????????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监听引用了某位博主的博客, 但是找不到了, 所以抱歉无法报明出处了!
web项目启动时配置监听本地目录文件添加, 删除, 修改, 等操作
原文地址:https://www.cnblogs.com/DarkStreet/p/8280808.html