SpringBoot整合jnotify实现针对指定目录及其(动态)子目录的监听的方法
简介
JNotify是让应用程序监听文件系统事件的Java库,可以监听的事件例如:
- 文件夹/文件创建
- 文件夹/文件删除
- 文件夹/文件修改 (文件内容被修改和文件夹被修改都可以检测到)
- 文件夹/文件重命名
支持操作系统:
- Windows
- Linux
- Max OS
准备式作
理论
因为Jnotify底层调用的关键部分是C语言开发的,所以需要在系统中加入jnotify_64bit.dll(64位) (Windows)或者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文件并解压

- 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的相对路径)
* @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目录监听内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot整合Mybatis LocalDateTime 映射失效的解决
这篇文章主要介绍了SpringBoot整合Mybatis LocalDateTime 映射失效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-01-01
Springboot下RedisTemplate的两种序列化方式实例详解
这篇文章主要介绍了Springboot下RedisTemplate的两种序列化方式,通过定义一个配置类,自定义RedisTemplate的序列化方式,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-09-09
spring boot 注入 property的三种方式(推荐)
这篇文章主要介绍了spring boot 注入 property的三种方式,需要的朋友可以参考下2017-07-07
springmvc+spring+mybatis实现用户登录功能(下)
这篇文章主要为大家详细介绍了springmvc+spring+mybatis实现用户登录功能的第二篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-07-07


最新评论