原创

文件实时监控--Jnotify的使用

JNotify,可以在指定目录下的文件进行监听,常用的有文件创建,文件重命名,文件删除,文件内容修改。这些都可以通过jnotify的API进行实时监测。在linux系统中,调用的是linux底层的inotify服务,只是添加了对子文件夹级联监控的功能。在windows中,需要添加附件的dll文件,因为windows默认没有该服务。
使用前提:
无论是javaWeb项目,还是普通的java项目都可以。这里只演示main方法运行,
如果使用的javaWeb建议使用异步监听操作。

windows环境下需要在jdk下放文件
64位
jnotify_64bit.dll
32位
jnotify.dll
所放位置:
file

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

第一步:导入Jar

普通项目,在这里下载jar包,即可
https://sourceforge.net/projects/jnotify/
如果你使用的是maven项目,导入依赖即可

<dependency>
    <groupId>net.contentobjects.jnotify</groupId>
    <artifactId>jnotify</artifactId>
    <version>0.94</version>
</dependency>

第二步:编写程序

JnotifyWatch.java


import net.contentobjects.jnotify.JNotify;
import net.contentobjects.jnotify.JNotifyAdapter;
import net.contentobjects.jnotify.JNotifyException;
/**
 * @Author: haohaowang
 * @Desc
 * @Date: 2019/4/22 11:33
 */
public class JnotifyWatch extends JNotifyAdapter {
    private static final String REQUEST_BASE_PATH = "C:/Users/Administrator/Desktop";
    /** 被监视的目录 */
    String path = REQUEST_BASE_PATH;
    /** 关注目录的事件 */
    int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
    /** 是否监视子目录,即级联监视,或者是是否监听子文件夹 */
    boolean watchSubtree = true;
    /** 监听程序Id */
    public int watchID;

    /**
     * 容器启动时启动监视程序
     *
     * @return
     */
    public void beginWatch() {
        /** 添加到监视队列中 */
        try {
            this.watchID = JNotify.addWatch(path, mask, watchSubtree, this);
            System.err.println("jnotify -----------启动成功-----------");
        } catch (JNotifyException e) {
            e.printStackTrace();
        }
        // 死循环,线程一直执行,休眠一分钟后继续执行,主要是为了让主线程一直执行
        // 休眠时间和监测文件发生的效率无关(就是说不是监视目录文件改变一分钟后才监测到,监测几乎是实时的,调用本地系统库)
        while (true) {
            try {
                Thread.sleep(60000);
            } catch (InterruptedException e) {// ignore it
            }
        }
    }

    /**
     * 当监听目录下一旦有新的文件被创建,则即触发该事件
     *
     * @param wd
     *            监听线程id
     * @param rootPath
     *            监听目录
     * @param name
     *            文件名称
     */
    public void fileCreated(int wd, String rootPath, String name) {
        System.err.println("文件被创建, 创建位置为: " + rootPath + "/" + name);
    }

    public void fileRenamed(int wd, String rootPath, String oldName, String newName) {
        System.err.println("文件被重命名, 原文件名为:" + rootPath + "/" + oldName
                + ", 现文件名为:" + rootPath + "/" + newName);
    }

    public void fileModified(int wd, String rootPath, String name) {
        System.err.println("文件内容被修改, 文件名为:" + rootPath + "/" + name);
    }

    public void fileDeleted(int wd, String rootPath, String name) {
        System.err.println("文件被删除, 被删除的文件名为:" + rootPath + name);
    }


    //点击这里运行即可
     public static void main(String[] args) {
        new JnotifyWatch().beginWatch();
    }
}

测试:

file

正文到此结束(点击广告是对作者最大的支持)