监听的文件变化的方式有很多,但是比较完美的还是jNotify

https://jnotify.sourceforge.net/

对比一下监控方式的优缺点

方式 缺点
java原生watch 可能对文件时间获取有缺毫秒的问题
commons-io 没有文件重命名事件的监听实现
jNotify 配置复杂,需要添加dll/so文件到系统

具体的jnotfiy的配置可自行查找。

现在给出jnotify的具体实现

  1. 导入依赖
<!-- https://mvnrepository.com/artifact/net.contentobjects.jnotify/jnotify -->
<dependency>
<groupId>net.contentobjects.jnotify</groupId>
<artifactId>jnotify</artifactId>
<version>0.94</version>
</dependency>
  1. 编写监控代码

import net.contentobjects.jnotify.JNotify;
import net.contentobjects.jnotify.JNotifyAdapter;
import net.contentobjects.jnotify.JNotifyException; import java.io.File; public class Watch extends JNotifyAdapter { //可以写到配置文件中
private static String WATCH_BASE_PATH;
public Watch(String path){
Watch.WATCH_BASE_PATH = path;
}
/**
* 关注目录的事件
*/
int mask =JNotify.FILE_CREATED |JNotify.FILE_DELETED| JNotify.FILE_RENAMED| JNotify.FILE_MODIFIED;
/**
* 是否监视子目录,即级联监视
*/
boolean watchSubtree = true;
/**
* 监听程序Id
*/
public int watchID; /**
* 容器启动时启动监视程序
*/
public void beginWatch() {
/**
* 添加到监视队列中
*/
try {
this.watchID = JNotify.addWatch(WATCH_BASE_PATH, mask, watchSubtree, this);
System.err.println("jnotify -----------启动成功-----------:" + watchID );
} catch (JNotifyException e) {
e.printStackTrace();
}
/**
* 死循环,线程一直执行,休眠一分钟后继续执行,主要是为了让主线程一直执行 休眠时间和监测文件发生的效率无
* (就是说不是监视目录文件改变一分钟后才监测到,监测几乎是实时的,调用本地系统库)
*/
while (true) {
try {
//主要缓和主线程的执行效率,
Thread.sleep(600);
} catch (InterruptedException e) {
// ignore it
}
}
} /**
* 文件创建
* @param wd 监听程序Id 初始为1,多个监控程序以此加1
* @param rootPath 目录名
* @param name 文件名
*/ @Override
public void fileCreated(int wd, String rootPath, String name) { System.err.println(wd+"----->文件被创建, 创建位置为: " + rootPath + "\\" + name);
} /**
* 删除文件
* @param wd 监听程序Id 初始为1,多个监控程序以此加1
* @param rootPath 目录名
* @param name 文件名
*/
@Override
public void fileDeleted(int wd, String rootPath, String name) {
System.err.println(wd+"----->文件被删除, 被删除的文件名为:" + rootPath + name);
} /**
* 文件修改 (文件内容被修改和文件夹被修改都可以检测到)
* @param wd 监听程序Id 初始为1,多个监控程序以此加1
* @param rootPath 目录名
* @param name 文件名
*/
@Override
public void fileModified(int wd, String rootPath, String name) {
String filePath = rootPath + name;
boolean isDir = filePath.indexOf('.') < 1;
// 是目录变更
if(filePath.indexOf('.') < 1){
return;
}
System.err.println(wd+"----->文件内容被修改, 文件名为:" + rootPath + "\\" + name + ", isdir:" + isDir);
} /**
* 文件重命名
* @param wd 监听程序Id 初始为1,多个监控程序以此加1
* @param rootPath 目录名
* @param oldName 修改前目录名
* @param newName 修改后目录名
*/
@Override
public void fileRenamed(int wd, String rootPath, String oldName, String newName) {
String filePath = rootPath + oldName;
// 是目录变更
if(filePath.indexOf('.') < 1){
System.err.println(wd+"----->文件夹被重命名, 原文件名为:" + rootPath + "\\" + oldName
+ ", 现文件名为:" + rootPath + "\\" + newName); } else {
System.err.println(wd+"----->文件被重命名, 原文件名为:" + rootPath + "\\" + oldName
+ ", 现文件名为:" + rootPath + "\\" + newName); }
}
}
  1. 查看输出

最新文章

  1. 杭电--1102--Constructing Roads--并查集
  2. iOS页面传值-wang
  3. iOS - 果冻效果
  4. shell中的循环
  5. H5下拉刷新特效demo,动画流畅
  6. 给python类动态添加方法(method)
  7. map/reduce实现数据去重
  8. css.day.05.eg
  9. Unity3D-Shader-实现X光效果
  10. rpm体系下的linux安装httpd+mysql+…
  11. Android NDK学习(五):Java调用Native代码流程总结
  12. 数据库事务的四大特性以及事务的隔离级别-与-Spring事务传播机制&amp;隔离级别
  13. CentOS 安全优化
  14. 01-Linux的基本指令
  15. Elasticsearch聚合 Date Histogram聚合
  16. Android——单例模式
  17. DP经典 BZOJ 1584: [Usaco2009 Mar]Cleaning Up 打扫卫生
  18. java扫描控制台输入
  19. IFC文档结构说明
  20. 微信小程序消息模板

热门文章

  1. final关键字用于修饰成员方法-final关键字用于修饰局部变量
  2. .Net 7 高端玩法,自定义一个CLR运行时
  3. Djanngo-bbs项目
  4. Springboot返回数据给前端-参数为null处理
  5. STM32F0库函数初始化系列:PWM输出
  6. window.alert和console.log()
  7. jmeter常见错误(持续更新)
  8. Tesseract图片文字识别
  9. 基于IGServer的Web地图要素增删改查
  10. .NET静态代码织入——肉夹馍(Rougamo) 发布1.4.0