1.介绍
jnotify指定目录下的文件可以监控,常用的有文件创建、文件重命名、文件删除、文件内容修改。这些都可以通过jnotify的API实时监控。
以前有很多关于监控的测试方法,apiWatcher等等,但是尝试了这个方法之后,真的很棒,这个api
2.下载地址
jnotify下载地址
在下载jar同时,您还需要下载一个dll文件
3.新建项目
打开 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