欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot整合jnotify實現(xiàn)針對指定目錄及其(動態(tài))子目錄的監(jiān)聽的方法

 更新時間:2024年10月29日 10:38:05   作者:梁云亮  
本文介紹了JNotify這一Java庫在SpringBoot中的應(yīng)用,JNotify允許應(yīng)用程序監(jiān)聽文件系統(tǒng)事件,包括文件夾/文件的創(chuàng)建、刪除、修改和重命名,由于JNotify底層調(diào)用的關(guān)鍵部分是C語言開發(fā)的,所以在使用前需要在系統(tǒng)中加入相應(yīng)的動態(tài)庫

簡介

JNotify是讓應(yīng)用程序監(jiān)聽文件系統(tǒng)事件的Java庫,可以監(jiān)聽的事件例如:

  • 文件夾/文件創(chuàng)建
  • 文件夾/文件刪除
  • 文件夾/文件修改 (文件內(nèi)容被修改和文件夾被修改都可以檢測到)
  • 文件夾/文件重命名

支持操作系統(tǒng):

  • Windows
  • Linux
  • Max OS

準(zhǔn)備式作

理論

因為Jnotify底層調(diào)用的關(guān)鍵部分是C語言開發(fā)的,所以需要在系統(tǒng)中加入jnotify_64bit.dll(64位) (Windows)或者libjnotify.so(linux)動態(tài)庫。

  • jnotify_64bit.dll(64位) 加入到System.getProperty(“java.library.path”)對應(yīng)的路徑中
  • libjnotify.so加入到啟動腳本的指定-Djava.library.path目錄中

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

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

操作

下載JNotify文件并解壓

  • windows系統(tǒng):將jnotify_64bit.dll放到j(luò)dk的bin目錄下,也可以直接放到c:/windows目錄中
  • linux系統(tǒng):將libnotify.so放到j(luò)dk的bin目錄下

示例

第一步:Maven依賴

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

第二步: 監(jiān)聽器

@Component
public class FileMonitorListener extends JNotifyAdapter {
    /**
     * 文件創(chuàng)建后調(diào)用
     *
     * @param watchId      監(jiān)視Id  初始為1,多個監(jiān)控程序以此加1
     * @param watchPath    被監(jiān)視的最上層路徑
     * @param relativePath 創(chuàng)建的文件相對watchPath的相對路徑
     */
    @Override
    public void fileCreated(int watchId, String watchPath, String relativePath) {
        System.out.println(String.format("watchId = [%s], 被監(jiān)視路徑 = [%s], 創(chuàng)建文件 = [%s]", watchId, watchPath, relativePath));
    }
    /**
     * 文件刪除后調(diào)用
     *
     * @param watchId      監(jiān)視Id 初始為1,多個監(jiān)控程序以此加1
     * @param watchPath    被監(jiān)視的最上層路徑
     * @param relativePath 刪除的文件相對watchPath的相對路徑
     */
    @Override
    public void fileDeleted(int watchId, String watchPath, String relativePath) {
        System.out.println(String.format("watchId = [%s], 被監(jiān)視路徑 = [%s], 刪除文件 = [%s]",
                watchId, watchPath, relativePath));
    }
    /**
     * 文件修改 (文件內(nèi)容被修改和文件夾被修改都可以檢測到)
     * @param watchId      監(jiān)視Id  初始為1,多個監(jiān)控程序以此加1
     * @param watchPath    被監(jiān)視的最上層路徑
     * @param relativePath 修改的文件相對watchPath的相對路徑
     */
    @Override
    public void fileModified(int watchId, String watchPath, String relativePath) {
        System.out.println(String.format("watchId = [%s], 被監(jiān)視路徑 = [%s], 修改文件 = [%s]",
                watchId, watchPath, relativePath));
    }
    /**
     * 文件重命名后調(diào)用
     *
     * @param watchId         監(jiān)視Id  初始為1,多個監(jiān)控程序以此加1
     * @param watchPath       被監(jiān)視的最上層路徑
     * @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], 被監(jiān)視路徑 = [%s], 文件重命名: [%s] -> [%s]",
                watchId, watchPath, oldRelativePath, newRelativePath));
    }
}

在控制器中啟動監(jiān)聽

@RestController
@RequestMapping("/file")
public class FileMonitorController {
    @Resource
    private FileMonitorListener fileMonitorListener;
    @GetMapping("/v1/monitor")
    public ResultBean<Void> monitorDir() {
        //在新線程中開啟監(jiān)聽
        new Thread(() -> {
            try {
                beginWatch();
            } catch (JNotifyException e) {
                e.printStackTrace();
            }
        }).start();
        return ResultBeanUtil.<Void>success(null).setMsg("文件監(jiān)聽開啟成功");
    }
    private void beginWatch() throws JNotifyException {
        String path1 = "e:/test/001";
        String path2 = "e:/test/002";
        // 是否監(jiān)視子目錄
        boolean watchSubtree = true;
        // 需要監(jiān)視的文件變更類型,此處用4個bit位表示,類似linux的文件訪問權(quán)限
        int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
        //添加監(jiān)聽
        int watchId1 = JNotify.addWatch(path1, mask, watchSubtree, fileMonitorListener);
        System.out.println("watchId1 = " + watchId1 + ", 開始監(jiān)視路徑:" + path1);
        // 添加監(jiān)聽
        int watchId2 = JNotify.addWatch(path2, JNotify.FILE_ANY, false, fileMonitorListener);
        System.out.println("watchId2 = " + watchId2 + ", 開始監(jiān)視路徑:" + path2);
    }
}

到此這篇關(guān)于SpringBoot整合jnotify實現(xiàn)針對指定目錄及其(動態(tài))子目錄的監(jiān)聽的文章就介紹到這了,更多相關(guān)SpringBoot整合jnotify目錄監(jiān)聽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合Mybatis?LocalDateTime?映射失效的解決

    SpringBoot整合Mybatis?LocalDateTime?映射失效的解決

    這篇文章主要介紹了SpringBoot整合Mybatis?LocalDateTime?映射失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java8 Stream流逐行處理文本文件

    java8 Stream流逐行處理文本文件

    這篇文章主要介紹了java8 Stream流逐行處理文本文件的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Java Eclipse進行斷點調(diào)試的方法

    Java Eclipse進行斷點調(diào)試的方法

    本篇文章主要介紹了Java Eclipse進行斷點調(diào)試的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • java中Class.forName方法的作用詳解

    java中Class.forName方法的作用詳解

    Class.forName(xxx.xx.xx) 返回的是一個類,但Class.forName方法的作用到底是什么終?下面這篇文章就來給大家詳細介紹了關(guān)于java中Class.forName方法的作用,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-06-06
  • java利用phantomjs進行截圖實例教程

    java利用phantomjs進行截圖實例教程

    PlantomJs是一個基于javascript的webkit內(nèi)核無頭瀏覽器 也就是沒有顯示界面的瀏覽器,你可以在基于 webkit 瀏覽器做的事情,它都能做到。下面這篇文章主要給大家介紹了關(guān)于java利用phantomjs進行截圖的相關(guān)資料,需要的朋友可以參考下
    2018-10-10
  • 史上最全的java隨機數(shù)生成算法分享

    史上最全的java隨機數(shù)生成算法分享

    這篇文章主要介紹了史上最全的java隨機數(shù)生成算法,我分享一個最全的隨機數(shù)的生成算法,最代碼的找回密碼的隨機數(shù)就是用的這個方法
    2014-01-01
  • Java如何構(gòu)造DSL方法重構(gòu)

    Java如何構(gòu)造DSL方法重構(gòu)

    這篇文章主要介紹了Java如何構(gòu)造DSL方法重構(gòu),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考價值
    2022-07-07
  • Springboot下RedisTemplate的兩種序列化方式實例詳解

    Springboot下RedisTemplate的兩種序列化方式實例詳解

    這篇文章主要介紹了Springboot下RedisTemplate的兩種序列化方式,通過定義一個配置類,自定義RedisTemplate的序列化方式,結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • spring boot 注入 property的三種方式(推薦)

    spring boot 注入 property的三種方式(推薦)

    這篇文章主要介紹了spring boot 注入 property的三種方式,需要的朋友可以參考下
    2017-07-07
  • springmvc+spring+mybatis實現(xiàn)用戶登錄功能(下)

    springmvc+spring+mybatis實現(xiàn)用戶登錄功能(下)

    這篇文章主要為大家詳細介紹了springmvc+spring+mybatis實現(xiàn)用戶登錄功能的第二篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07

最新評論