SpringBoot整合jnotify实现针对指定目录及其(动态)子目录的监听的方法

 更新时间:2024年10月29日 10:38:05   作者:梁云亮  
本文介绍了JNotify这一Java库在SpringBoot中的应用,JNotify允许应用程序监听文件系统事件,包括文件夹/文件的创建、删除、修改和重命名,由于JNotify底层调用的关键部分是C语言开发的,所以在使用前需要在系统中加入相应的动态库

简介

JNotify是让应用程序监听文件系统事件的Java库,可以监听的事件例如:

  • 文件夹/文件创建
  • 文件夹/文件删除
  • 文件夹/文件修改 (文件内容被修改和文件夹被修改都可以检测到)
  • 文件夹/文件重命名

支持操作系统:

  • Windows
  • Linux
  • Max OS

准备式作

理论

因为Jnotify底层调用的关键部分是C语言开发的,所以需要在系统中加入jnotify_64bit.dll(64位) (Windows)或者libjnotify.so(linux)动态库。

  • jnotify_64bit.dll(64位) 加入到System.getProperty(“java.library.path”)对应的路径中
  • libjnotify.so加入到启动脚本的指定-Djava.library.path目录中

提示:
Java有两个Path,一个是classpath,另外一个library.path。

  • classpath是设置JDK的lib位置.
  • 而library.path是设置引用的非Java类包(如DLL,SO)的位置。

操作

下载JNotify文件并解压

  • windows系统:将jnotify_64bit.dll放到jdk的bin目录下,也可以直接放到c:/windows目录中
  • linux系统:将libnotify.so放到jdk的bin目录下

示例

第一步:Maven依赖

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

第二步: 监听器

@Component
public class FileMonitorListener extends JNotifyAdapter {
    /**
     * 文件创建后调用
     *
     * @param watchId      监视Id  初始为1,多个监控程序以此加1
     * @param watchPath    被监视的最上层路径
     * @param relativePath 创建的文件相对watchPath的相对路径
     */
    @Override
    public void fileCreated(int watchId, String watchPath, String relativePath) {
        System.out.println(String.format("watchId = [%s], 被监视路径 = [%s], 创建文件 = [%s]", watchId, watchPath, relativePath));
    }
    /**
     * 文件删除后调用
     *
     * @param watchId      监视Id 初始为1,多个监控程序以此加1
     * @param watchPath    被监视的最上层路径
     * @param relativePath 删除的文件相对watchPath的相对路径
     */
    @Override
    public void fileDeleted(int watchId, String watchPath, String relativePath) {
        System.out.println(String.format("watchId = [%s], 被监视路径 = [%s], 删除文件 = [%s]",
                watchId, watchPath, relativePath));
    }
    /**
     * 文件修改 (文件内容被修改和文件夹被修改都可以检测到)
     * @param watchId      监视Id  初始为1,多个监控程序以此加1
     * @param watchPath    被监视的最上层路径
     * @param relativePath 修改的文件相对watchPath的相对路径
     */
    @Override
    public void fileModified(int watchId, String watchPath, String relativePath) {
        System.out.println(String.format("watchId = [%s], 被监视路径 = [%s], 修改文件 = [%s]",
                watchId, watchPath, relativePath));
    }
    /**
     * 文件重命名后调用
     *
     * @param watchId         监视Id  初始为1,多个监控程序以此加1
     * @param watchPath       被监视的最上层路径
     * @param oldRelativePath 修改前文件名(相对watchPath的相对路径)
     * @param newRelativePath 修改后文件名(相对watchPath的相对路径)
     */
    @Override
    public void fileRenamed(int watchId, String watchPath, String oldRelativePath, String newRelativePath) {
        System.out.println(String.format("watchId = [%s], 被监视路径 = [%s], 文件重命名: [%s] -> [%s]",
                watchId, watchPath, oldRelativePath, newRelativePath));
    }
}

在控制器中启动监听

@RestController
@RequestMapping("/file")
public class FileMonitorController {
    @Resource
    private FileMonitorListener fileMonitorListener;
    @GetMapping("/v1/monitor")
    public ResultBean<Void> monitorDir() {
        //在新线程中开启监听
        new Thread(() -> {
            try {
                beginWatch();
            } catch (JNotifyException e) {
                e.printStackTrace();
            }
        }).start();
        return ResultBeanUtil.<Void>success(null).setMsg("文件监听开启成功");
    }
    private void beginWatch() throws JNotifyException {
        String path1 = "e:/test/001";
        String path2 = "e:/test/002";
        // 是否监视子目录
        boolean watchSubtree = true;
        // 需要监视的文件变更类型,此处用4个bit位表示,类似linux的文件访问权限
        int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
        //添加监听
        int watchId1 = JNotify.addWatch(path1, mask, watchSubtree, fileMonitorListener);
        System.out.println("watchId1 = " + watchId1 + ", 开始监视路径:" + path1);
        // 添加监听
        int watchId2 = JNotify.addWatch(path2, JNotify.FILE_ANY, false, fileMonitorListener);
        System.out.println("watchId2 = " + watchId2 + ", 开始监视路径:" + path2);
    }
}

到此这篇关于SpringBoot整合jnotify实现针对指定目录及其(动态)子目录的监听的文章就介绍到这了,更多相关SpringBoot整合jnotify目录监听内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java通过证书访问etcd的实现步骤

    java通过证书访问etcd的实现步骤

    Etcd提供了多种语言的客户端库,本文主要介绍了java通过证书访问etcd的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • Java 中This用法的实例详解

    Java 中This用法的实例详解

    这篇文章主要介绍了 Java 中This用法的实例详解的相关资料,希望通过本文大家能理解掌握this关键字的使用方法,需要的朋友可以参考下
    2017-09-09
  • Spring Security OAuth2 授权码模式的实现

    Spring Security OAuth2 授权码模式的实现

    这篇文章主要介绍了Spring Security OAuth2 授权码模式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 详解Java基础知识——JDBC

    详解Java基础知识——JDBC

    这篇文章主要介绍了Java基础知识——JDBC,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Java文件操作工具类fileUtil实例【文件增删改,复制等】

    Java文件操作工具类fileUtil实例【文件增删改,复制等】

    这篇文章主要介绍了Java文件操作工具类fileUtil,结合实例形式分析了java针对文件进行读取、增加、删除、修改、复制等操作的相关实现技巧,需要的朋友可以参考下
    2017-10-10
  • Spring JPA使用CriteriaBuilder动态构造查询方式

    Spring JPA使用CriteriaBuilder动态构造查询方式

    这篇文章主要介绍了Spring JPA使用CriteriaBuilder动态构造查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java性能优化之关于大对象复用的目标和注意点

    Java性能优化之关于大对象复用的目标和注意点

    这篇文章主要介绍了Java性能优化之关于大对象复用的目标和注意点,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 基于@RequestParam注解之Spring MVC参数绑定的利器

    基于@RequestParam注解之Spring MVC参数绑定的利器

    这篇文章主要介绍了基于@RequestParam注解之Spring MVC参数绑定的利器,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • springboot3如何接入nacos

    springboot3如何接入nacos

    这篇文章主要介绍了springboot3接入nacos的配置方法,经过很长时间的折腾终于搞定,下面把步骤操作过程分享给大家,需要的朋友可以参考下
    2024-03-03
  • mybatis-plus中更新null值的问题解决

    mybatis-plus中更新null值的问题解决

    本文主要介绍 mybatis-plus 中常使用的 update 相关方法的区别,以及更新 null 的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-04-04

最新评论