SpringBoot整合jnotify實(shí)現(xiàn)針對指定目錄及其(動(dòng)態(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)備式作
理論
因?yàn)镴notify底層調(diào)用的關(guān)鍵部分是C語言開發(fā)的,所以需要在系統(tǒng)中加入jnotify_64bit.dll(64位) (Windows)或者libjnotify.so(linux)動(dòng)態(tài)庫。
- jnotify_64bit.dll(64位) 加入到System.getProperty(“java.library.path”)對應(yīng)的路徑中
- libjnotify.so加入到啟動(dòng)腳本的指定-Djava.library.path目錄中
提示:
Java有兩個(gè)Path,一個(gè)是classpath,另外一個(gè)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,多個(gè)監(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,多個(gè)監(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,多個(gè)監(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,多個(gè)監(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));
}
}在控制器中啟動(dòng)監(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個(gè)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實(shí)現(xiàn)針對指定目錄及其(動(dòng)態(tài))子目錄的監(jiān)聽的文章就介紹到這了,更多相關(guān)SpringBoot整合jnotify目錄監(jiān)聽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java通過證書訪問etcd的實(shí)現(xiàn)步驟
Etcd提供了多種語言的客戶端庫,本文主要介紹了java通過證書訪問etcd的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
Spring Security OAuth2 授權(quán)碼模式的實(shí)現(xiàn)
這篇文章主要介紹了Spring Security OAuth2 授權(quán)碼模式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Java文件操作工具類fileUtil實(shí)例【文件增刪改,復(fù)制等】
這篇文章主要介紹了Java文件操作工具類fileUtil,結(jié)合實(shí)例形式分析了java針對文件進(jìn)行讀取、增加、刪除、修改、復(fù)制等操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-10-10
Spring?JPA使用CriteriaBuilder動(dòng)態(tài)構(gòu)造查詢方式
這篇文章主要介紹了Spring?JPA使用CriteriaBuilder動(dòng)態(tài)構(gòu)造查詢方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java性能優(yōu)化之關(guān)于大對象復(fù)用的目標(biāo)和注意點(diǎn)
這篇文章主要介紹了Java性能優(yōu)化之關(guān)于大對象復(fù)用的目標(biāo)和注意點(diǎn),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
基于@RequestParam注解之Spring MVC參數(shù)綁定的利器
這篇文章主要介紹了基于@RequestParam注解之Spring MVC參數(shù)綁定的利器,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03

