监听的文件变化的方式有很多,但是比较完美的还是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. 了解 Transformers 是如何“思考”的

    Transformer 模型是 AI 系统的基础.已经有了数不清的关于 "Transformer 如何工作" 的核心结构图表. 但是这些图表没有提供任何直观的计算该模型的框架表示. ...

  2. 基于APIView写接口

    一.视图层代码 """ 基于APIView实现接口的编写 用的是同一个模型表 路由也没变 这次做了解耦合 写了序列化类 与视图类分开了 """ ...

  3. vscode 配置复盘

        第一句话,看文档!code.visualstudio.com/docs/editor- 从这里开始看,上下辐射看完debug看task,然后再看其他的诸如"智能感知"    ...

  4. JDBC工具类,减少代码冗余好帮手

    首先要在scr下创建一个file文件 当然 需要初始的注册驱动和数据库操作都可以实现,才可以用jdbc工具类进行减多少代码冗余~可以看前面一篇的博客,就是写如何连接jdbc哈~代码运行成功的快乐真的好 ...

  5. JZOJ 3737. 【NOI2014模拟7.11】挖宝藏

    \(\text{Solution}\) 当 \(h=1\) 时显然是斯坦纳树板子,最方案必然是树形的 \(h > 1\) 时,考虑在每一层新建一个状态表示上一层宝藏全部挖完到这层某个点的答案 同 ...

  6. LG P4168 [Violet]蒲公英

    \(\text{Problem}\) 强制在线静态询问区间众数 \(\text{Solution}\) 不得不说 \(vector\) 是真的慢 做 \(LOJ\) 数列分块入门 \(9\) 卡时间卡 ...

  7. [NOIP2018 提高组] 保卫王国

    题解 两只 \(\log\) 的动态 \(dp\) ! 相比标算倍增 动态 \(dp\) 既实用又好理解 \(Code\) #include<cstdio> #include<ios ...

  8. RA维持期达标式减停生物制剂(DRESS研究)的18个月数据

    标签:类风湿关节炎; TNF抑制剂; 达标式减停药物 RA维持期达标式减停生物制剂(DRESS研究): 18个月临床疗效与继续足量应用者相仿 电邮发布日期: 2016-01-14 由于缺乏对常规诊疗有 ...

  9. vue2和vue3区别

    1. vue2和vue3双向数据绑定原理发生了改变 vue2的双向数据绑定是利用了es5 的一个API Object.definepropert() 对数据进行劫持 结合发布订阅模式来实现的.vue3 ...

  10. vue element-table滚动条样式修改

    .table_class{ &::v-deep { .el-table__body-wrapper::-webkit-scrollbar { /*width: 0;宽度为0隐藏*/ width ...