监听的文件变化的方式有很多,但是比较完美的还是jNotify
https://jnotify.sourceforge.net/
对比一下监控方式的优缺点
方式缺点java原生watch可能对文件时间获取有缺毫秒的问题commons-io没有文件重命名事件的监听实现jNotify配置复杂,需要添加dll/so文件到系统具体的jnotfiy的配置可自行查找。
现在给出jnotify的具体实现
- <dependency>
- <groupId>net.contentobjects.jnotify</groupId>
- <artifactId>jnotify</artifactId>
- <version>0.94</version>
- </dependency>
复制代码- import net.contentobjects.jnotify.JNotify;
- import net.contentobjects.jnotify.JNotifyAdapter;
- import net.contentobjects.jnotify.JNotifyException;
- import java.io.File;
- public class Watch extends JNotifyAdapter {
- //可以写到配置文件中
- private static String WATCH_BASE_PATH;
- public Watch(String path){
- Watch.WATCH_BASE_PATH = path;
- }
- /**
- * 关注目录的事件
- */
- int mask =JNotify.FILE_CREATED |JNotify.FILE_DELETED| JNotify.FILE_RENAMED| JNotify.FILE_MODIFIED;
- /**
- * 是否监视子目录,即级联监视
- */
- boolean watchSubtree = true;
- /**
- * 监听程序Id
- */
- public int watchID;
- /**
- * 容器启动时启动监视程序
- */
- public void beginWatch() {
- /**
- * 添加到监视队列中
- */
- try {
- this.watchID = JNotify.addWatch(WATCH_BASE_PATH, mask, watchSubtree, this);
- System.err.println("jnotify -----------启动成功-----------:" + watchID );
- } catch (JNotifyException e) {
- e.printStackTrace();
- }
- /**
- * 死循环,线程一直执行,休眠一分钟后继续执行,主要是为了让主线程一直执行 休眠时间和监测文件发生的效率无
- * (就是说不是监视目录文件改变一分钟后才监测到,监测几乎是实时的,调用本地系统库)
- */
- while (true) {
- try {
- //主要缓和主线程的执行效率,
- Thread.sleep(600);
- } catch (InterruptedException e) {
- // ignore it
- }
- }
- }
- /**
- * 文件创建
- * @param wd 监听程序Id 初始为1,多个监控程序以此加1
- * @param rootPath 目录名
- * @param name 文件名
- */
- @Override
- public void fileCreated(int wd, String rootPath, String name) {
- System.err.println(wd+"----->文件被创建, 创建位置为: " + rootPath + "\" + name);
- }
- /**
- * 删除文件
- * @param wd 监听程序Id 初始为1,多个监控程序以此加1
- * @param rootPath 目录名
- * @param name 文件名
- */
- @Override
- public void fileDeleted(int wd, String rootPath, String name) {
- System.err.println(wd+"----->文件被删除, 被删除的文件名为:" + rootPath + name);
- }
- /**
- * 文件修改 (文件内容被修改和文件夹被修改都可以检测到)
- * @param wd 监听程序Id 初始为1,多个监控程序以此加1
- * @param rootPath 目录名
- * @param name 文件名
- */
- @Override
- public void fileModified(int wd, String rootPath, String name) {
- String filePath = rootPath + name;
- boolean isDir = filePath.indexOf('.') < 1;
- // 是目录变更
- if(filePath.indexOf('.') < 1){
- return;
- }
- System.err.println(wd+"----->文件内容被修改, 文件名为:" + rootPath + "\" + name + ", isdir:" + isDir);
- }
- /**
- * 文件重命名
- * @param wd 监听程序Id 初始为1,多个监控程序以此加1
- * @param rootPath 目录名
- * @param oldName 修改前目录名
- * @param newName 修改后目录名
- */
- @Override
- public void fileRenamed(int wd, String rootPath, String oldName, String newName) {
- String filePath = rootPath + oldName;
- // 是目录变更
- if(filePath.indexOf('.') < 1){
- System.err.println(wd+"----->文件夹被重命名, 原文件名为:" + rootPath + "\" + oldName
- + ", 现文件名为:" + rootPath + "\" + newName);
- } else {
- System.err.println(wd+"----->文件被重命名, 原文件名为:" + rootPath + "\" + oldName
- + ", 现文件名为:" + rootPath + "\" + newName);
- }
- }
- }
复制代码
- 查看输出
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |