文件监控利器-Jnotify

海哥  金牌会员 | 2023-2-23 19:46:42 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 826|帖子 826|积分 2478

监听的文件变化的方式有很多,但是比较完美的还是jNotify
https://jnotify.sourceforge.net/
对比一下监控方式的优缺点
方式缺点java原生watch可能对文件时间获取有缺毫秒的问题commons-io没有文件重命名事件的监听实现jNotify配置复杂,需要添加dll/so文件到系统具体的jnotfiy的配置可自行查找。
现在给出jnotify的具体实现

  • 导入依赖
  1. <dependency>
  2.     <groupId>net.contentobjects.jnotify</groupId>
  3.     <artifactId>jnotify</artifactId>
  4.     <version>0.94</version>
  5. </dependency>
复制代码

  • 编写监控代码
  1. import net.contentobjects.jnotify.JNotify;
  2. import net.contentobjects.jnotify.JNotifyAdapter;
  3. import net.contentobjects.jnotify.JNotifyException;
  4. import java.io.File;
  5. public class Watch extends JNotifyAdapter {
  6.     //可以写到配置文件中
  7.     private static String WATCH_BASE_PATH;
  8.     public Watch(String path){
  9.         Watch.WATCH_BASE_PATH = path;
  10.     }
  11.     /**
  12.      * 关注目录的事件
  13.      */
  14.     int mask =JNotify.FILE_CREATED |JNotify.FILE_DELETED| JNotify.FILE_RENAMED| JNotify.FILE_MODIFIED;
  15.     /**
  16.      * 是否监视子目录,即级联监视
  17.      */
  18.     boolean watchSubtree = true;
  19.     /**
  20.      * 监听程序Id
  21.      */
  22.     public int watchID;
  23.     /**
  24.      * 容器启动时启动监视程序
  25.      */
  26.     public void beginWatch() {
  27.         /**
  28.          * 添加到监视队列中
  29.          */
  30.         try {
  31.             this.watchID = JNotify.addWatch(WATCH_BASE_PATH, mask, watchSubtree, this);
  32.             System.err.println("jnotify -----------启动成功-----------:" + watchID );
  33.         } catch (JNotifyException e) {
  34.             e.printStackTrace();
  35.         }
  36.         /**
  37.          * 死循环,线程一直执行,休眠一分钟后继续执行,主要是为了让主线程一直执行 休眠时间和监测文件发生的效率无
  38.          * (就是说不是监视目录文件改变一分钟后才监测到,监测几乎是实时的,调用本地系统库)
  39.          */
  40.         while (true) {
  41.             try {
  42.                 //主要缓和主线程的执行效率,
  43.                 Thread.sleep(600);
  44.             } catch (InterruptedException e) {
  45.                 // ignore it
  46.             }
  47.         }
  48.     }
  49.     /**
  50.      * 文件创建
  51.      * @param wd 监听程序Id 初始为1,多个监控程序以此加1
  52.      * @param rootPath 目录名
  53.      * @param name 文件名
  54.      */
  55.     @Override
  56.     public void fileCreated(int wd, String rootPath, String name) {
  57.         System.err.println(wd+"----->文件被创建, 创建位置为: " + rootPath + "\" + name);
  58.     }
  59.     /**
  60.      * 删除文件
  61.      * @param wd 监听程序Id 初始为1,多个监控程序以此加1
  62.      * @param rootPath 目录名
  63.      * @param name 文件名
  64.      */
  65.     @Override
  66.     public void fileDeleted(int wd, String rootPath, String name) {
  67.         System.err.println(wd+"----->文件被删除, 被删除的文件名为:" + rootPath + name);
  68.     }
  69.     /**
  70.      * 文件修改 (文件内容被修改和文件夹被修改都可以检测到)
  71.      * @param wd 监听程序Id 初始为1,多个监控程序以此加1
  72.      * @param rootPath 目录名
  73.      * @param name 文件名
  74.      */
  75.     @Override
  76.     public void fileModified(int wd, String rootPath, String name) {
  77.         String filePath = rootPath + name;
  78.         boolean isDir = filePath.indexOf('.') < 1;
  79.         // 是目录变更
  80.         if(filePath.indexOf('.') < 1){
  81.             return;
  82.         }
  83.         System.err.println(wd+"----->文件内容被修改, 文件名为:" + rootPath + "\" + name + ", isdir:" + isDir);
  84.     }
  85.     /**
  86.      * 文件重命名
  87.      * @param wd 监听程序Id 初始为1,多个监控程序以此加1
  88.      * @param rootPath 目录名
  89.      * @param oldName 修改前目录名
  90.      * @param newName 修改后目录名
  91.      */
  92.     @Override
  93.     public void fileRenamed(int wd, String rootPath, String oldName, String newName) {
  94.         String filePath = rootPath + oldName;
  95.         // 是目录变更
  96.         if(filePath.indexOf('.') < 1){
  97.             System.err.println(wd+"----->文件夹被重命名, 原文件名为:" + rootPath + "\" + oldName
  98.                     + ", 现文件名为:" + rootPath + "\" + newName);
  99.         } else {
  100.             System.err.println(wd+"----->文件被重命名, 原文件名为:" + rootPath + "\" + oldName
  101.                     + ", 现文件名为:" + rootPath + "\" + newName);
  102.         }
  103.     }
  104. }
复制代码

  • 查看输出


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

海哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表