1.配置监听器

  web项目配置监听器

  web.xml添加

<listener> <listener-class>cn.com.test.InitListener</listener-class>
</listener>

  实现ServletContextListener接口

package cn.com.test;import java.io.File;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;public class InitListener implements ServletContextListener{@Overridepublic void contextInitialized(ServletContextEvent arg0) {final File file = new File("D:\\cs");new Thread(new Runnable() {@Overridepublic void run() {try {new WatchDir(file, true, new FileActionCallback() {@Overridepublic void create(File file) {System.out.println("文件已创建\t" + file.getAbsolutePath());}     @Overridepublic void delete(File file) {System.out.println("文件已删除\t" + file.getAbsolutePath());} @Overridepublic void modify(File file) {System.out.println("文件已修改\t" + file.getAbsolutePath());}});} catch (Exception e) {e.printStackTrace();}}}).start();System.out.println("正在监视文件夹:" + file.getAbsolutePath());}
}

spring boot项目配置监听器

  启动类添加@WebListener注解支持

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.bind.annotation.RestController;import cn.com.app.constant.TaskThreadPoolConfig;@RestController
@SpringBootApplication
@EnableScheduling      //开启定时任务支持
@EnableAsync           //开启多线程异步任务支持
@ServletComponentScan   //开启对监听器@WebListener注解支持
@EnableConfigurationProperties(TaskThreadPoolConfig.class) // 开启配置属性支持
@MapperScan("cn.com.app.dao")
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

通过@WebListener注解开启监听

import java.io.File;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;@WebListener
public class ContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent arg0) {final File file = new File("D:\\cs");new Thread(new Runnable() {@Overridepublic void run() {try {new WatchDir(file, true, new FileActionCallback() {@Overridepublic void create(File file) {System.out.println("文件已创建\t" + file.getAbsolutePath());}     @Overridepublic void delete(File file) {System.out.println("文件已删除\t" + file.getAbsolutePath());} @Overridepublic void modify(File file) {System.out.println("文件已修改\t" + file.getAbsolutePath());}});} catch (Exception e) {e.printStackTrace();}}}).start();System.out.println("正在监视文件夹:" + file.getAbsolutePath());}
}

2.创建监控文件夹核心类

import static java.nio.file.LinkOption.NOFOLLOW_LINKS;import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchEvent.Kind;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.HashMap;
import java.util.Map;/*** 文件夹监控*/
public class WatchDir {private final WatchService watcher;private final Map<WatchKey, Path> keys;private final boolean subDir;/*** 构造方法* @param file 文件目录,不可以是文件*/public WatchDir(File file, boolean subDir, FileActionCallback callback) throws Exception {if (!file.isDirectory())throw new Exception(file.getAbsolutePath() + "不是文件夹!");this.watcher = FileSystems.getDefault().newWatchService();this.keys = new HashMap<WatchKey, Path>();this.subDir = subDir;Path dir = Paths.get(file.getAbsolutePath());if (subDir) {registerAll(dir);} else {register(dir);}processEvents(callback);}@SuppressWarnings("unchecked")static <T> WatchEvent<T> cast(WatchEvent<?> event) {return (WatchEvent<T>) event;}/*** 观察指定的目录*/private void register(Path dir) throws IOException {WatchKey key = dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);keys.put(key, dir);}/*** 观察指定的目录,并且包括子目录*/private void registerAll(final Path start) throws IOException {Files.walkFileTree(start, new SimpleFileVisitor<Path>() {@Overridepublic FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {register(dir);return FileVisitResult.CONTINUE;}});}/*** 发生文件变化的回调函数*/@SuppressWarnings("rawtypes")void processEvents(FileActionCallback callback) {for (;;) {WatchKey key;try {key = watcher.take();} catch (InterruptedException x) {return;}Path dir = keys.get(key);if (dir == null) {System.err.println("操作未识别");continue;}for (WatchEvent<?> event : key.pollEvents()) {Kind kind = event.kind();// 事件可能丢失或遗弃if (kind == StandardWatchEventKinds.OVERFLOW) {continue;}// 目录内的变化可能是文件或者目录WatchEvent<Path> ev = cast(event);Path name = ev.context();Path child = dir.resolve(name);File file = child.toFile();if (kind.name().equals("ENTRY_DELETE")) {callback.delete(file);} else if (kind.name().equals("ENTRY_CREATE")) {callback.create(file);} else if (kind.name().equals("ENTRY_MODIFY")) {callback.modify(file);} else {continue;}if (subDir && (kind == StandardWatchEventKinds.ENTRY_CREATE)) {try {if (Files.isDirectory(child, NOFOLLOW_LINKS)) {registerAll(child);}} catch (IOException x) {}}}boolean valid = key.reset();if (!valid) {// 移除不可访问的目录// 因为有可能目录被移除,就会无法访问keys.remove(key);// 如果待监控的目录都不存在了,就中断执行if (keys.isEmpty()) {break;}}}}}

3.创建文件操作回调方法

import java.io.File;/*** 文件操作的回调方法*/
public abstract class FileActionCallback {public void delete(File file) {};public void modify(File file) {};public void create(File file) {};}

备注:由于WatchService为jdk7添加,因此需要jdk版本为7及以上

Java实时监控文件夹变化相关推荐

  1. 服务器文件变更监控,监控文件夹变化并ftp到服务器

    监控文件夹变化并ftp到服务器 内容精选 换一换 Loader是在开源Sqoop组件的基础上进行了一些扩展,除了包含Sqoop开源组件本身已有的功能外,还开发了如下的增强特性:提供数据转化功能支持图形 ...

  2. php 监控文件夹变化,swoole 开发中监听目录文件变化, 自动重启项目

    在使用swoole的项目中, 在开发时, 会经常改动代码并查看效果, 由于swoole项目是常驻内存的, 代码改动后并不会影响已经在运行中并加载过该代码的程序, 所以需要重启项目. 为了在改动代码之后 ...

  3. java监听mysql_java实时监控mysql数据库变化

    对于二次开发来说,很大一部分就找找文件和找数据库的变化情况 对于数据库变化.还没有发现比较好用的监控数据库变化监控软件. 今天,我就给大家介绍一个如何使用mysql自带的功能监控数据库变化 1.打开数 ...

  4. 利用shell监控云服务器文件夹变化

    利用shell监控云服务器文件夹变化 简介 这个代码的主要功能是对一台linux服务器(我使用的为centos7版本)的某个文件夹进行监控,当这个文件夹发生变化时(比如有对文件的增,删,改操作),那么 ...

  5. linux下使用inotify实时监控文件变更,做完整性检查

    完整性检查是HIDS的重要组成部分之一,linux下做完整性检查的思路有3个 1.哈希对比 2.签名校验 3.inotify 方法有2个: A.定期检测,例如通过cron或程序内置计时器 B.实时检测 ...

  6. linux监控覆盖视频恢复,linux下使用inotify实时监控文件变更,做完整性检查

    linux下使用inotify实时监控文件变更,做完整性检查 完整性检查是HIDS的重要组成部分之一,linux下做完整性检查的思路有3个 1.哈希对比 2.签名校验 3.inotify 方法有2个: ...

  7. java 接口文件夹_Java NIO.2 使用Path接口来监听文件、文件夹变化

    Java7对NIO进行了大的改进,新增了许多功能: •对文件系统的访问提供了全面的支持 •提供了基于异步Channel的IO 这些新增的IO功能简称为 NIO.2,依然在java.nio包下. 早期的 ...

  8. python实时监控文件大小_python实现实时监控文件的方法

    在业务稳定性要求比较高的情况下,运维为能及时发现问题,有时需要对应用程序的日志进行实时分析,当符合某个条件时就立刻报警,而不是被动等待出问题后去解决,比如要监控nginx的$request_time和 ...

  9. inotifywait监听php,inotifywait 是一个可以实时监控文件变动的工具

    inotifywait 是一个可以实时监控文件变动的工具,它利用linux内核中的inotify机制实现监控功能. 查看内核版本 [root@Oracle ~]# uname -r 2.6.32-22 ...

最新文章

  1. Python实现微信防撤回
  2. python系统-基于Python搭建Django后台管理系统
  3. 比較++和+的运算符优先级
  4. 009_JMS中的事务
  5. 炫界 (978) -(建工发现应用克隆漏)_湖南建工装配式建筑迈入“加速度”
  6. 里工实业:用宜搭自主搭建MES系统,实现生产全流程管理
  7. python中DictVectorizer的使用
  8. 字典排序什么意思_字典排序问题
  9. 使用telnet命令测试网络时连接建立后无法退出解决办法
  10. 小爱音箱mini系统故障怎么办_Win7系统连接小爱音箱mini的方法【图文】
  11. 为了物尽其用报废的涉密计算机的硬盘,检测不到硬盘不能轻易将其定为报废
  12. android自定义加载旋转框
  13. 去雾算法学习-----Automatic recovery of the atmospheric light hazy image(fattal 大气光值自适应去雾算法)阅读笔记
  14. 电网设备股集体上涨,国家电网称将推进电网数字化转型
  15. 这可能是中国最穷的211大学!连研究生奖学金都发不起了....
  16. 系统重构数据同步利器之Canal实战篇
  17. Qt | QTableView的使用方法
  18. GPGPU基础(二):GPGPU需要用到的OpenGL概念
  19. mybatis-plus设置id自增,插入数据。
  20. Studio One 5机架设置一键切换效果通道

热门文章

  1. 网宿PHP工资应届生,IT 毕业生工资
  2. 微信视频美颜怎么设置?不用化妆也很好看
  3. hive中over的用法
  4. springboot 微信小程序获取用户手机号 最新方式
  5. 省标准配置初中计算机室,最新初中9室及配置标准(62页)-原创力文档
  6. 解决 Python百度云bypy包 授权失败问题
  7. 苹果10亿美元收购英特尔手机基带业务 买下iPhone一颗“定芯丸”
  8. css持续淡入淡出,CSS如何使元素淡入淡出然后淡出?
  9. c#mysql连接数据库字符串_C# 连接SQL数据库字符串
  10. 将训练好的pytorch模型的pth文件转换成onnx模型(亲测成功)