Java实时监控文件夹变化
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实时监控文件夹变化相关推荐
- 服务器文件变更监控,监控文件夹变化并ftp到服务器
监控文件夹变化并ftp到服务器 内容精选 换一换 Loader是在开源Sqoop组件的基础上进行了一些扩展,除了包含Sqoop开源组件本身已有的功能外,还开发了如下的增强特性:提供数据转化功能支持图形 ...
- php 监控文件夹变化,swoole 开发中监听目录文件变化, 自动重启项目
在使用swoole的项目中, 在开发时, 会经常改动代码并查看效果, 由于swoole项目是常驻内存的, 代码改动后并不会影响已经在运行中并加载过该代码的程序, 所以需要重启项目. 为了在改动代码之后 ...
- java监听mysql_java实时监控mysql数据库变化
对于二次开发来说,很大一部分就找找文件和找数据库的变化情况 对于数据库变化.还没有发现比较好用的监控数据库变化监控软件. 今天,我就给大家介绍一个如何使用mysql自带的功能监控数据库变化 1.打开数 ...
- 利用shell监控云服务器文件夹变化
利用shell监控云服务器文件夹变化 简介 这个代码的主要功能是对一台linux服务器(我使用的为centos7版本)的某个文件夹进行监控,当这个文件夹发生变化时(比如有对文件的增,删,改操作),那么 ...
- linux下使用inotify实时监控文件变更,做完整性检查
完整性检查是HIDS的重要组成部分之一,linux下做完整性检查的思路有3个 1.哈希对比 2.签名校验 3.inotify 方法有2个: A.定期检测,例如通过cron或程序内置计时器 B.实时检测 ...
- linux监控覆盖视频恢复,linux下使用inotify实时监控文件变更,做完整性检查
linux下使用inotify实时监控文件变更,做完整性检查 完整性检查是HIDS的重要组成部分之一,linux下做完整性检查的思路有3个 1.哈希对比 2.签名校验 3.inotify 方法有2个: ...
- java 接口文件夹_Java NIO.2 使用Path接口来监听文件、文件夹变化
Java7对NIO进行了大的改进,新增了许多功能: •对文件系统的访问提供了全面的支持 •提供了基于异步Channel的IO 这些新增的IO功能简称为 NIO.2,依然在java.nio包下. 早期的 ...
- python实时监控文件大小_python实现实时监控文件的方法
在业务稳定性要求比较高的情况下,运维为能及时发现问题,有时需要对应用程序的日志进行实时分析,当符合某个条件时就立刻报警,而不是被动等待出问题后去解决,比如要监控nginx的$request_time和 ...
- inotifywait监听php,inotifywait 是一个可以实时监控文件变动的工具
inotifywait 是一个可以实时监控文件变动的工具,它利用linux内核中的inotify机制实现监控功能. 查看内核版本 [root@Oracle ~]# uname -r 2.6.32-22 ...
最新文章
- Python实现微信防撤回
- python系统-基于Python搭建Django后台管理系统
- 比較++和+的运算符优先级
- 009_JMS中的事务
- 炫界 (978) -(建工发现应用克隆漏)_湖南建工装配式建筑迈入“加速度”
- 里工实业:用宜搭自主搭建MES系统,实现生产全流程管理
- python中DictVectorizer的使用
- 字典排序什么意思_字典排序问题
- 使用telnet命令测试网络时连接建立后无法退出解决办法
- 小爱音箱mini系统故障怎么办_Win7系统连接小爱音箱mini的方法【图文】
- 为了物尽其用报废的涉密计算机的硬盘,检测不到硬盘不能轻易将其定为报废
- android自定义加载旋转框
- 去雾算法学习-----Automatic recovery of the atmospheric light hazy image(fattal 大气光值自适应去雾算法)阅读笔记
- 电网设备股集体上涨,国家电网称将推进电网数字化转型
- 这可能是中国最穷的211大学!连研究生奖学金都发不起了....
- 系统重构数据同步利器之Canal实战篇
- Qt | QTableView的使用方法
- GPGPU基础(二):GPGPU需要用到的OpenGL概念
- mybatis-plus设置id自增,插入数据。
- Studio One 5机架设置一键切换效果通道
热门文章
- 网宿PHP工资应届生,IT 毕业生工资
- 微信视频美颜怎么设置?不用化妆也很好看
- hive中over的用法
- springboot 微信小程序获取用户手机号 最新方式
- 省标准配置初中计算机室,最新初中9室及配置标准(62页)-原创力文档
- 解决 Python百度云bypy包 授权失败问题
- 苹果10亿美元收购英特尔手机基带业务 买下iPhone一颗“定芯丸”
- css持续淡入淡出,CSS如何使元素淡入淡出然后淡出?
- c#mysql连接数据库字符串_C# 连接SQL数据库字符串
- 将训练好的pytorch模型的pth文件转换成onnx模型(亲测成功)