文件实时监控--Jnotify的使用
JNotify,可以在指定目录下的文件进行监听,常用的有文件创建,文件重命名,文件删除,文件内容修改。这些都可以通过jnotify的API进行实时监测。在linux系统中,调用的是linux底层的inotify服务,只是添加了对子文件夹级联监控的功能。在windows中,需要添加附件的dll文件,因为windows默认没有该服务。
使用前提:
无论是javaWeb项目,还是普通的java项目都可以。这里只演示main方法运行,
如果使用的javaWeb建议使用异步监听操作。
windows环境下需要在jdk下放文件
64位jnotify_64bit.dll
32位jnotify.dll
所放位置:
如果是在linux上面使用,需要注意的是文件目录需要修改,以及jnotify.dll需要换成libjnotify.so(放到/lib64/当中)。
第一步:导入Jar
普通项目,在这里下载jar包,即可
https://sourceforge.net/projects/jnotify/
如果你使用的是maven项目,导入依赖即可
<dependency>
<groupId>net.contentobjects.jnotify</groupId>
<artifactId>jnotify</artifactId>
<version>0.94</version>
</dependency>
第二步:编写程序
JnotifyWatch.java
import net.contentobjects.jnotify.JNotify;
import net.contentobjects.jnotify.JNotifyAdapter;
import net.contentobjects.jnotify.JNotifyException;
/**
* @Author: haohaowang
* @Desc
* @Date: 2019/4/22 11:33
*/
public class JnotifyWatch extends JNotifyAdapter {
private static final String REQUEST_BASE_PATH = "C:/Users/Administrator/Desktop";
/** 被监视的目录 */
String path = REQUEST_BASE_PATH;
/** 关注目录的事件 */
int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
/** 是否监视子目录,即级联监视,或者是是否监听子文件夹 */
boolean watchSubtree = true;
/** 监听程序Id */
public int watchID;
/**
* 容器启动时启动监视程序
*
* @return
*/
public void beginWatch() {
/** 添加到监视队列中 */
try {
this.watchID = JNotify.addWatch(path, mask, watchSubtree, this);
System.err.println("jnotify -----------启动成功-----------");
} catch (JNotifyException e) {
e.printStackTrace();
}
// 死循环,线程一直执行,休眠一分钟后继续执行,主要是为了让主线程一直执行
// 休眠时间和监测文件发生的效率无关(就是说不是监视目录文件改变一分钟后才监测到,监测几乎是实时的,调用本地系统库)
while (true) {
try {
Thread.sleep(60000);
} catch (InterruptedException e) {// ignore it
}
}
}
/**
* 当监听目录下一旦有新的文件被创建,则即触发该事件
*
* @param wd
* 监听线程id
* @param rootPath
* 监听目录
* @param name
* 文件名称
*/
public void fileCreated(int wd, String rootPath, String name) {
System.err.println("文件被创建, 创建位置为: " + rootPath + "/" + name);
}
public void fileRenamed(int wd, String rootPath, String oldName, String newName) {
System.err.println("文件被重命名, 原文件名为:" + rootPath + "/" + oldName
+ ", 现文件名为:" + rootPath + "/" + newName);
}
public void fileModified(int wd, String rootPath, String name) {
System.err.println("文件内容被修改, 文件名为:" + rootPath + "/" + name);
}
public void fileDeleted(int wd, String rootPath, String name) {
System.err.println("文件被删除, 被删除的文件名为:" + rootPath + name);
}
//点击这里运行即可
public static void main(String[] args) {
new JnotifyWatch().beginWatch();
}
}
测试:
正文到此结束(点击广告是对作者最大的支持)