监听的文件变化的方式有很多,但是比较完美的还是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. 查看输出

文件监控利器-Jnotify的更多相关文章

  1. 测者的性能测试手册:JVM的监控利器

    测者的性能测试手册:JVM的监控利器 每次聊起性能测试,最后的终结话题就是怎么做优化.其实在Java的复杂项目中都会有内存不足问题.内存泄露问题.线程死锁问题.CPU问题.这些问题工程测试或者是小压力 ...

  2. Linux 服务器运行健康状况监控利器 Spotlight on Unix 的安装与使用

    1.本文背景 1.1.Linux 服务器情况 # cat /etc/issueRed Hat Enterprise Linux Server release 6.1 (Santiago)Kernel ...

  3. 老技术新谈,Java应用监控利器JMX(2)

    各位坐稳扶好,我们要开车了.不过在开车之前,我们还是例行回顾一下上期分享的要点. 上期由于架不住来自于程序员内心的灵魂的拷问,于是我们潜心修炼,与 Java 应用监控利器 JMX 正式打了个照面. J ...

  4. 在C#使用文件监控对象FileSystemWatcher的几种方案

    最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容.首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能超过1S,而且每次获取到文本内容都要去分发给web服务 ...

  5. 使用文件监控对象FileSystemWatcher实现数据同步

    最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容.首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能超过1S,而且每次获取到文本内容都要去分发给WEB服务 ...

  6. C#使用文件监控对象FileSystemWatcher 实现数据同步

    在C#使用文件监控对象FileSystemWatcher 实现数据同步 2013-12-12 18:24 by 幕三少, 352 阅读, 3 评论, 收藏, 编辑 最近在项目中有这么个需求,就是得去实 ...

  7. 同步文件的利器-rsync

    即使你只是个人用户而不是一个企业,备份你自己的数据也是非常重要的,我不想失去任何这些数据. rsync是同步文件的利器,一般用于多个机器之间的文件同步与备份,同时也支持在本地的不同目录之间互相同步文件 ...

  8. C#使用FileSystemWatcher控件实现的文件监控功能示例

    本文实例讲述了C#使用FileSystemWatcher控件实现的文件监控功能.分享给大家供大家参考,具体如下: FileSystemWatcher 可以使用FileSystemWatcher组件监视 ...

  9. java实现文件监控

    文件监控器: package testfile; import org.apache.commons.io.monitor.FileAlterationListenerAdaptor; import ...

  10. Nodejs文件监控chokidar

    最近有个需求是扫描用例,用例是放在svn上,如果每次扫描都去遍历目录的话会有占用太多的io,所以想着用文件监控,有文件变化时只对该文件进行操作. Nodejs里的 chokidar 模块可以更好的对文 ...

随机推荐

  1. 【随笔记】Littlevgl 8.x 踩过的坑

    在多线程并发使用的时候,总是在运行过程中莫名其妙的 crash,后面才意识到 LVGL 本身不支持并发,加了互斥锁解决了. 在引入矢量字库时(freetype),又有启动时会概率性 crash 的问题 ...

  2. 可能是最简单的本地GPT3 对话机器人,支持OpenAI 和 Azure OpenAI

    毫无疑问,GPT是目前最火的人工智能方向,已经商用的有OpenAI公司原生的GPT3 和 ChatGPT ,以及微软公司的Azure OpenAI Service (暂时还没有包含ChatGPT).关 ...

  3. springcloud 08 Hystrix图形化DashBoard

    #1.构建一个服务监控模块 ##1.1创建模块cloud-consumer-hystrix-dashboard9001 ##1.2pom文件依赖 <dependencies> <!- ...

  4. Mysql中where if问题

    网上关于Mybatis中where与if的说法乱七八糟的,Myabtis官网写的很清晰.为了防止误导他人,在此记录: 1.where语句+< if > 标签 <select id=& ...

  5. java2022.7.9

    知识点

  6. RocketMQ - 生产者启动流程

    生产者启动流程 DefaultMQProducer是RocketMQ中默认的生产者实现 核心属性: namesrvAddr: 继承自 ClientConfig,表示 RocketMQ 集群的Names ...

  7. 获取某地模型并用Cesium加载(一)

    2023-01-04 最近想用Cesium给学校做一个类似智慧校园的东西,要做的东西很多,首先是获取学校模型的问题,然后怎么用Cesium加载3Dtile 1.获取学校模型 想到之前被老师抓苦力去做春 ...

  8. LG P3653 小清新数学题

    \(\text{Poblem}\) 求 \(\sum_{i=l}^r \mu(i)\) \(1 \le l,r \le 10^{18}, r - l \le 10^5\) \(\text{Analys ...

  9. Ubuntu20.04桌面系统快速上手教程

    转载csdn:ChunKai93 https://blog.csdn.net/iamzhoujunjia/article/details/105349441

  10. CKeditor页面公式不显示

    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax. ...