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
準備式作
理論
因為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-01
Springboot下RedisTemplate的兩種序列化方式實例詳解
這篇文章主要介紹了Springboot下RedisTemplate的兩種序列化方式,通過定義一個配置類,自定義RedisTemplate的序列化方式,結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09
spring boot 注入 property的三種方式(推薦)
這篇文章主要介紹了spring boot 注入 property的三種方式,需要的朋友可以參考下2017-07-07
springmvc+spring+mybatis實現(xiàn)用戶登錄功能(下)
這篇文章主要為大家詳細介紹了springmvc+spring+mybatis實現(xiàn)用戶登錄功能的第二篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07

