监听的文件变化的方式有很多,但是比较完美的还是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. 字符输入流读取字符数据-writer类

    字符输入流读取字符数据 读取字符:read方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回-1,循环读取,代码使用演示∶ writer类 java.io.Filelwriter ...

  2. 包装类总结-Collection集合概述

    包装类总结 1.基本数据类型对应的包装类byte Byteshort Shortint Integerlong Longfloat Floatdouble Doublechar Characterbo ...

  3. Ubuntu下安装cURL库用于libcurl开发

    http://archive.ubuntu.com/ubuntu/pool/main/c/curl/curl_7.22.0.orig.tar.gz 不要问我为什么,根据cURL主页的下载向导给的就是这 ...

  4. 【LeetCode字符串#05】基于个人理解的KMP算法图解,以及应用到strStr()函数实现

    KMP算法(用于实现 strStr()) strStr()函数是用来在一个字符串中搜索是否存在另一个字符串的函数,其匹配字符串方式为KMP算法 KMP算法基础理论 假设有如下两个字符串 文本串 aab ...

  5. 毕设进度更新(真的不知道自己做到哪- - 备忘录性质)+3.19是mavan配置的常见问题

    3.19 maven的配置 我也不知道我的cmd 输入mvn complie就是报错 也没办法下载 奇了怪了 检查了setting文件也没得- - 然后也没办法像老师一样直接导入tomcat的包 但是 ...

  6. C++_bind用法

    1.bind函数 网络编程中, 经常要使用到回调函数. 当底层的网络框架有数据过来时,往往通过回调函数来通知业务层. 这样可以使网络层只专注于 数据的收发, 而不必关心业务 在c语言中, 回调函数的实 ...

  7. 学习Java Day22

    今天学习了如何在包中增加类,想要将包放入类中,就必须将包的名字放在源文件的开头,即放在定义这个包中各个类的代码之前

  8. The Missing Semester - 第二讲 学习笔记

    第二讲 Shell 工具和脚本 课程视频地址: https://www.bilibili.com/video/BV1Vv411v7FR 本机学习使用平台:虚拟机ubuntu18.04.6 主题一:Sh ...

  9. 注释、input()、运算符、组织结构(顺序、选择、循环)

    注释 单行注释 # 多行注释 将三对引号之间的为多行注释 ''' ''' 中文编码的声明注释 #coding:gbk input()函数 接受来自用户的输入 返回值是str 值的存储 使用=对输入的值 ...

  10. NoSQL(简介、历史)

    NoSQL 为什么使用NoSQL 1.单机MySQL的网站 APP----->DAL------>MySQL 90年代:一个基本的网站访问量一般不会很大,单个数据库完全足够. 那个时候,更 ...