SpringBoot整合jnotify實現(xiàn)針對指定目錄及其(動態(tài))子目錄的監(jiān)聽的方法
簡介
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?映射失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01Springboot下RedisTemplate的兩種序列化方式實例詳解
這篇文章主要介紹了Springboot下RedisTemplate的兩種序列化方式,通過定義一個配置類,自定義RedisTemplate的序列化方式,結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09spring boot 注入 property的三種方式(推薦)
這篇文章主要介紹了spring boot 注入 property的三種方式,需要的朋友可以參考下2017-07-07springmvc+spring+mybatis實現(xiàn)用戶登錄功能(下)
這篇文章主要為大家詳細介紹了springmvc+spring+mybatis實現(xiàn)用戶登錄功能的第二篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07