• jnotify实现文件实时监控(只能在windows环境下进行)


    1.介绍

    jnotify可以对指定目录下的文件进行监听,常用的有文件创建,文件重命名,文件删除,文件内容修改。这些都可以通过jnotify的API进行实时监测。

    之前也有很多关于监听的测试方式,apiWatcher的方式等等,但在尝试了这种方式过后,真的太赞了,这个api

    2.下载地址

    jnotify下载地址

    在下载jar的同时,也需要下载一个dll文件

    3.新建项目

    打开 idea 新建一个maven项目

    在项目的pom文件中新增依赖 此时为jnotify依赖的地址

        <dependencies>
            <!--应用第三方包监听文件-->
            <dependency>
                <groupId>jnotify</groupId>
                <artifactId>jnotify</artifactId>
                <version>0.94.0</version>
                <scope>system</scope>
                <systemPath>${basedir}/src/main/resources/lib/jnotify-0.94.jar</systemPath>
            </dependency>
        </dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    注意依赖中的一定要填写,不然无法正常生效

    标签中填写的是jar所在的地址,由于jnotify使用maven直接下载可能会失败或无法下载,我们可以自行下载下来,然后进行安装

    此时将我们的jar包放在src/main/resources/lib/jnotify-0.94.jar目录下

    如下图

    image-20220624203919158

    此时我们还需要进行一步重要的操作:

    在本机的jdk的安装目录下的bin目录下将之前下载的jar包中的jnotify.dll文件放入,如果是64位放jnotify_64bit.dll

    就是将我们下载下来的dll放在我们的java目录下的jdk1.8.0_281目录下的bin目录下即可

    此时我们进行测试代码:

    
    import com.sun.org.slf4j.internal.Logger;
    import com.sun.org.slf4j.internal.LoggerFactory;
    import net.contentobjects.jnotify.JNotify;
    import net.contentobjects.jnotify.JNotifyAdapter;
    import net.contentobjects.jnotify.JNotifyException;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.List;
    import java.util.stream.Collectors;
    
    
    public class NewListen extends JNotifyAdapter {
        // 需要监听的文件路径地址
        String path = "E:/data";
        /** 关注目录的事件 */
        int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
        /** 是否监视子目录,即级联监视 */
        boolean watchSubtree = true;
        /** 监听程序Id */
        public int watchID;
    
        public static void main(String[] args) {
            new NewListen().beginWatch();
        }
        /**
         * 容器启动时启动监视程序
         *
         * @return
         */
        public void beginWatch() {
            /** 添加到监视队列中 */
            try {
                this.watchID = JNotify.addWatch(path, mask, watchSubtree, this);
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
                System.out.println("开始文件监听:" + df.format(new Date()) + "\t 文件目录:" + path);
            } catch (JNotifyException e) {
                e.printStackTrace();
            }
            // 死循环,线程一直执行,休眠一分钟后继续执行,主要是为了让主线程一直执行
            // 休眠时间和监测文件发生的效率无关(就是说不是监视目录文件改变一分钟后才监测到,监测几乎是实时的,调用本地系统库)
            while (true) {
                try {
                    Thread.sleep(60000);
                } catch (InterruptedException e) {// ignore it
                }
            }
        }
    
        /**
         * 当监听目录下一旦有新的文件被创建,则即触发该事件
         *
         * @param wd
         *            监听线程id
         * @param rootPath
         *            监听目录
         * @param name
         *            文件名称
         */
        @Override
        public void fileCreated(int wd, String rootPath, String name) {
            System.err.println("文件被创建, 创建位置为: " + rootPath + "/" + name);
        }
    
        @Override
        public void fileRenamed(int wd, String rootPath, String oldName, String newName) {
            System.err.println("文件被重命名, 原文件名为:" + rootPath + "/" + oldName
                    + ", 现文件名为:" + rootPath + "/" + newName);
        }
        @Override
        public void fileModified(int wd, String rootPath, String name) {
            System.err.println("文件内容被修改, 文件名为:" + rootPath + "/" + name);
        }
        @Override
        public void fileDeleted(int wd, String rootPath, String name) {
            System.err.println("文件被删除, 被删除的文件名为:" + rootPath + name);
        }
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82

    成功启动:

    image-20220624204706097

    我们尝试着新建一个文件试试看

    image-20220624204833837

    此时可以成功的识别到

    我们再去删除这个文件试试看:

    image-20220624204911190

    也可以成功识别出来,此时我们的这个监听已经全部写好了。

    注意:如果是在linux上面使用,需要注意的是文件目录需要修改,以及jnotify.dll需要换成libjnotify.so(放到/lib64/当中)。

    PS:我尝试过很多中监听方式,但是这种方式是我见过效率最高,速度最快的实时文件监听的方式。

    注意:一定要将dll文件放在java文件中,不然会报错

    nux上面使用,需要注意的是文件目录需要修改,以及jnotify.dll需要换成libjnotify.so(放到/lib64/当中)。==

    PS:我尝试过很多中监听方式,但是这种方式是我见过效率最高,速度最快的实时文件监听的方式。

    注意:一定要将dll文件放在java文件中,不然会报错

    gitee仓库地址:https://gitee.com/liuhuanhuan963019/jnotify.git

  • 相关阅读:
    GBase 8a MPP集群规划
    java文件命令行报错: 找不到或无法加载主类XXX报错及解决
    “鸿蒙之父”王成录离职华为,下一站是这里
    VirtualBox 安装UOS统信服务器操作系统
    【阿旭机器学习实战】【11】文本分类实战:利用朴素贝叶斯模型进行邮件分类
    基于springboot小型车队管理系统毕业设计源码061709
    js — 原生轮播图的制作
    在win10上安装pytorch-gpu版本2
    Acwing.4382 快速打字(双指针)
    ssm+vue+elementUI 高校志愿者服务招募网站-#毕业设计
  • 原文地址:https://blog.csdn.net/qq_38140292/article/details/125452128