jnotify可以对指定目录下的文件进行监听,常用的有文件创建,文件重命名,文件删除,文件内容修改。这些都可以通过jnotify的API进行实时监测。
之前也有很多关于监听的测试方式,apiWatcher的方式等等,但在尝试了这种方式过后,真的太赞了,这个api
在下载jar的同时,也需要下载一个dll文件
打开 idea 新建一个maven项目
在项目的pom文件中新增依赖 此时为jnotify依赖的地址
<dependencies>
<!--应用第三方包监听文件-->
<dependency>
<groupId>jnotify</groupId>
<artifactId>jnotify</artifactId>
<version>0.94.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/lib/jnotify-0.94.jar</systemPath>
</dependency>
</dependencies>
注意依赖中的一定要填写,不然无法正常生效
标签中填写的是jar所在的地址,由于jnotify使用maven直接下载可能会失败或无法下载,我们可以自行下载下来,然后进行安装
此时将我们的jar包放在src/main/resources/lib/jnotify-0.94.jar
目录下
如下图
此时我们还需要进行一步重要的操作:
在本机的jdk的安装目录下的bin目录下将之前下载的jar包中的jnotify.dll文件放入,如果是64位放jnotify_64bit.dll
就是将我们下载下来的dll放在我们的java目录下的jdk1.8.0_281
目录下的bin
目录下即可
此时我们进行测试代码:
import com.sun.org.slf4j.internal.Logger;
import com.sun.org.slf4j.internal.LoggerFactory;
import net.contentobjects.jnotify.JNotify;
import net.contentobjects.jnotify.JNotifyAdapter;
import net.contentobjects.jnotify.JNotifyException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
public class NewListen extends JNotifyAdapter {
// 需要监听的文件路径地址
String path = "E:/data";
/** 关注目录的事件 */
int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
/** 是否监视子目录,即级联监视 */
boolean watchSubtree = true;
/** 监听程序Id */
public int watchID;
public static void main(String[] args) {
new NewListen().beginWatch();
}
/**
* 容器启动时启动监视程序
*
* @return
*/
public void beginWatch() {
/** 添加到监视队列中 */
try {
this.watchID = JNotify.addWatch(path, mask, watchSubtree, this);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
System.out.println("开始文件监听:" + df.format(new Date()) + "\t 文件目录:" + path);
} catch (JNotifyException e) {
e.printStackTrace();
}
// 死循环,线程一直执行,休眠一分钟后继续执行,主要是为了让主线程一直执行
// 休眠时间和监测文件发生的效率无关(就是说不是监视目录文件改变一分钟后才监测到,监测几乎是实时的,调用本地系统库)
while (true) {
try {
Thread.sleep(60000);
} catch (InterruptedException e) {// ignore it
}
}
}
/**
* 当监听目录下一旦有新的文件被创建,则即触发该事件
*
* @param wd
* 监听线程id
* @param rootPath
* 监听目录
* @param name
* 文件名称
*/
@Override
public void fileCreated(int wd, String rootPath, String name) {
System.err.println("文件被创建, 创建位置为: " + rootPath + "/" + name);
}
@Override
public void fileRenamed(int wd, String rootPath, String oldName, String newName) {
System.err.println("文件被重命名, 原文件名为:" + rootPath + "/" + oldName
+ ", 现文件名为:" + rootPath + "/" + newName);
}
@Override
public void fileModified(int wd, String rootPath, String name) {
System.err.println("文件内容被修改, 文件名为:" + rootPath + "/" + name);
}
@Override
public void fileDeleted(int wd, String rootPath, String name) {
System.err.println("文件被删除, 被删除的文件名为:" + rootPath + name);
}
}
成功启动:
我们尝试着新建一个文件试试看
此时可以成功的识别到
我们再去删除这个文件试试看:
也可以成功识别出来,此时我们的这个监听已经全部写好了。
注意:如果是在linux上面使用,需要注意的是文件目录需要修改,以及jnotify.dll需要换成libjnotify.so(放到/lib64/当中)。
PS:我尝试过很多中监听方式,但是这种方式是我见过效率最高,速度最快的实时文件监听的方式。
注意:一定要将dll文件放在java文件中,不然会报错
nux上面使用,需要注意的是文件目录需要修改,以及jnotify.dll需要换成libjnotify.so(放到/lib64/当中)。==
PS:我尝试过很多中监听方式,但是这种方式是我见过效率最高,速度最快的实时文件监听的方式。
注意:一定要将dll文件放在java文件中,不然会报错
gitee仓库地址:https://gitee.com/liuhuanhuan963019/jnotify.git