开发者

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

目录
  • 简介
  • 准备式作
    • 理论
    • 操作
  • 示例

    简介

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

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

    支持操作系统:

    • Windows
    • linux
    • Max OS

    准备式作

    理论

    因为Jnotify底层调用的关键部分是C语言开发的,所以需要在系统中加入jnotify_64bit.dll(64位) (Windows)或KZyZXNnsb者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文件并解压

    SpringBoot整合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的相对路径)
       www.devze.com  * @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目录监听内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜