栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java实现实时监控目录下文件变化的方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java实现实时监控目录下文件变化的方法

一、commons-io方法

1、使用Commons-io的monitor下的相关类可以处理对文件进行监控,它采用的是观察者模式来实现的

  • (1)可以监控文件夹的创建、删除和修改
  • (2)可以监控文件的创建、删除和修改
  • (3)采用的是观察者模式来实现的
  • (4)采用线程去定时去刷新检测文件的变化情况

2、引入commons-io包,需要2.0以上。



  commons-io
  commons-io
  2.6

3、编写继承FileAlterationListenerAdaptor的类FileListener。

import java.io.File;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.apache.log4j.Logger;

public class FileListener extends FileAlterationListenerAdaptor {
  private Logger log = Logger.getLogger(FileListener.class);
  
  public void onFileCreate(File file) {
    log.info("[新建]:" + file.getAbsolutePath());
  }
  
  public void onFileChange(File file) {
    log.info("[修改]:" + file.getAbsolutePath());
  }
  
  public void onFileDelete(File file) {
    log.info("[删除]:" + file.getAbsolutePath());
  }
  
  public void onDirectoryCreate(File directory) {
    log.info("[新建]:" + directory.getAbsolutePath());
  }
  
  public void onDirectoryChange(File directory) {
    log.info("[修改]:" + directory.getAbsolutePath());
  }
  
  public void onDirectoryDelete(File directory) {
    log.info("[删除]:" + directory.getAbsolutePath());
  }
  public void onStart(FileAlterationObserver observer) {
    // TODO Auto-generated method stub
    super.onStart(observer);
  }
  public void onStop(FileAlterationObserver observer) {
    // TODO Auto-generated method stub
    super.onStop(observer);
  }
}

4、实现main方法

public static void main(String[] args) throws Exception{
    // 监控目录
    String rootDir = "D:\apache-tomcat-7.0.78";
    // 轮询间隔 5 秒
    long interval = TimeUnit.SECONDS.toMillis(1);
    // 创建过滤器
    IOFileFilter directories = FileFilterUtils.and(
 FileFilterUtils.directoryFileFilter(),
 HiddenFileFilter.VISIBLE);
    IOFileFilter files    = FileFilterUtils.and(
 FileFilterUtils.fileFileFilter(),
 FileFilterUtils.suffixFileFilter(".txt"));
    IOFileFilter filter = FileFilterUtils.or(directories, files);
    // 使用过滤器
    FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir), filter);
    //不使用过滤器
    //FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir));
    observer.addListener(new FileListener());
    //创建文件变化监听器
    FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer);
    // 开始监控
    monitor.start();
  }

二、使用JDK7提供的WatchService

public static void main(String[] a) {
    final Path path = Paths.get("D:\apache-tomcat-7.0.78");
    try (WatchService watchService = FileSystems.getDefault().newWatchService()) {
      //给path路径加上文件观察服务
      path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
   StandardWatchEventKinds.ENTRY_MODIFY,
   StandardWatchEventKinds.ENTRY_DELETE);
      while (true) {
 final WatchKey key = watchService.take();
 for (WatchEvent watchEvent : key.pollEvents()) {
   final WatchEvent.Kind kind = watchEvent.kind();
   if (kind == StandardWatchEventKinds.OVERFLOW) {
     continue;
   }
   //创建事件
   if (kind == StandardWatchEventKinds.ENTRY_CREATE) {
     System.out.println("[新建]");
   }
   //修改事件
   if (kind == StandardWatchEventKinds.ENTRY_MODIFY) {
     System.out.println("修改]");
   }
   //删除事件
   if (kind == StandardWatchEventKinds.ENTRY_DELETE) {
     System.out.println("[删除]");
   }
   // get the filename for the event
   final WatchEvent watchEventPath = (WatchEvent) watchEvent;
   final Path filename = watchEventPath.context();
   // print it out
   System.out.println(kind + " -> " + filename);
 }
 boolean valid = key.reset();
 if (!valid) {
   break;
 }
      }
    } catch (IOException | InterruptedException ex) {
      System.err.println(ex);
    }
  }

三、以上方法都可以实现对相应文件夹得文件监控,但是在使用jdk7提供的API时,会出现些许问题。

  • (1)当文件修改时,会被调用两次,即输出两个相同的修改。
  • (2)不能对其子文件夹进行监控,只能提示目录被修改。
  • (3)无法对文件类型进行过滤。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对考高分网的支持。如果你想了解更多相关内容请查看下面相关链接

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/138734.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号