欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-26 10:31:34
一、commons-io方法 1、使用commons-io的monitor下的相关类可以处理对文件进行监控,它采用的是观察者模式来实现的 (1)可以监控文件夹的...

一、commons-io方法

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

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

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

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
  <groupid>commons-io</groupid>
  <artifactid>commons-io</artifactid>
  <version>2.6</version>
</dependency>

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;
/**
 * 文件变化监听器
 * 在apache的commons-io中有关于文件的监控功能的代码. 文件监控的原理如下:
 * 由文件监控类filealterationmonitor中的线程不停的扫描文件观察器filealterationobserver,
 * 如果有文件的变化,则根据相关的文件比较器,判断文件时新增,还是删除,还是更改。(默认为1000毫秒执行一次扫描)
 */
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<path> watcheventpath = (watchevent<path>) 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)无法对文件类型进行过滤。

总结

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