资讯详情

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> 

注意填写依赖,否则不能正常生效

标签中填写的是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);
    }


}

成功启动:

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

此时可以成功的识别到

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

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

注意:如果是在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

标签: nux光电传感器pnnux光电传感器ps

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台