java实现文件变化监控的方法(推荐)

 更新时间:2016年08月22日 09:58:23   投稿:jingxian  
下面小编就为大家带来一篇java实现文件变化监控的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

一. spring配置文件:application.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:context="http://www.springframework.org/schema/context" xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
  xmlns:jaxrs="http://cxf.apache.org/jaxrs"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
    http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd
    http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
  
  <!-- 文件监测器 -->  
  <bean id="monitor"
    class="com.interfaces.file.monitor.FileMonitorImpl">
  
    <constructor-arg index="0" value="10000" />          <!-- 监测时间间隔,单位:毫秒 -->
    <constructor-arg index="1" ref="observer" />        <!-- 文件观察器 -->
  </bean>    
  
  <!-- 文件观察器 -->    
  <bean id="observer"
    class="com.interfaces.file.monitor.FileObserverImpl">
    
    <constructor-arg index="0" value="D:\\UploadDir"/>      <!-- 观察的目录 -->
    <constructor-arg index="1" ref="filter"/>          <!-- 文件过滤器-->
    <constructor-arg index="2" ref="listener"/>          <!-- 文件监听器 -->
  </bean>
  
  <!-- 文件监听器 -->  
  <bean id="listener"
    class="com.interfaces.file.monitor.FileListener"/>
  
  <!-- 文件过滤器 -->    
  <bean id="filter"
    class="com.interfaces.file.monitor.FileFilterImpl">    
    <!-- 
      指定文件扩展名,只有指定的扩展名文件会被处理。
      不同的扩展名间以 "," 间隔,如:xml,txt,bak 
    -->
    <constructor-arg index="0" value="xml"/>    
  </bean>
</beans>

二. spring上下文加载监听器:SpringContextLoaderListener.class

import javax.servlet.ServletContextEvent;

import org.springframework.web.context.ContextLoaderListener;

public class SpringContextLoaderListener extends ContextLoaderListener{
  
  @Override
  public void contextInitialized(ServletContextEvent event) {
    super.contextInitialized(event);
    
    FileMonitor scanner = getScanner();
    
    // 启动目录扫描器
    scanner.start();
  }
  
  @Override
  public void contextDestroyed(ServletContextEvent event) {
    FileMonitor scanner = getScanner();
    
    // 关闭目录扫描器
    scanner.stop();
    
    super.contextDestroyed(event);
  }
  
  /**
   * 获取目录扫描器
   * @return
   */
  private FileMonitor getScanner() {
    return getCurrentWebApplicationContext().getBean(FileMonitor.class);
  }
}

三. web工程配置文件:web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_4.xsd http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.4">
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
      classpath:application.xml
  </param-value>
 </context-param>
 <listener>
   <listener-class>com.web.SpringContextLoaderListener</listener-class>
 </listener>
  
</web-app>

四. 文件监测器

1. 接口:FileMonitor.class

import org.apache.commons.io.monitor.FileAlterationObserver;

/**
 * 文件监测器角色
 */
public interface FileMonitor {

  /**
   * 注册观察器
   * @param observer  观察器
   */
  void addObserver(FileAlterationObserver observer);
    
  /**
   * 删除观察器
   * @param observer  观察器
   */
  void removeObserver(FileAlterationObserver observer);  
  
  /**
   * 获取注册的所有观察器
   * @return  观察器集合
   */
  Iterable<FileAlterationObserver> getObservers();  
  
  /**
   * 启动监测器
   */
  void start();  
  
  /**
   * 停止监测器
   */
  void stop();  
  
  /**
   * 获取监测间隔时间
   * @return  间隔时间(单位:毫秒)
   */
  long getInterval();  
  
}

2. 实现类:FileMonitorImpl.class

import java.util.concurrent.ThreadFactory;

import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;

/**
 * 监测器,监测时间间隔,设置文件观察器
 */
public class FileMonitorImpl implements FileMonitor{

  private final FileAlterationMonitor monitor;
  
  /**
   * 监测器线程名称
   */
  private static final String MONITOR_THREAD_NAME = "File MONITOR Daemon";
    
  /**
   * 监测器线程Daemon标记
   */
  private static final boolean DAEMON = false;
  
  
  /**
   * 定义监测时间间隔、文件观察器
   * @param interval  监测时间间隔
   * @param observer  文件观察者
   */
  FileMonitorImpl(int interval, final FileAlterationObserver observer) {
    this(interval, observer, 
      new BasicThreadFactory.Builder().
          namingPattern(MONITOR_THREAD_NAME).daemon(DAEMON).build());    
  }  
  
  /**
   * 定义监测时间间隔、文件观察器和线程工厂
   * @param interval  监测时间间隔
   * @param observer  文件观察器
   * @param factory  线程工厂
   */
  FileMonitorImpl(int interval, final FileAlterationObserver observer, 
              final ThreadFactory factory) {    
    this.monitor = new FileAlterationMonitor(interval, new FileAlterationObserver[] { observer });
    monitor.setThreadFactory(factory);    
  } 
  
  /**
   * 添加文件观察器
   * @param observer
   */
  @Override
  public void addObserver(FileAlterationObserver observer) {
    monitor.addObserver(observer);
  }

  /**
   * 删除文件观察器 
   * @param observer
   */
  @Override
  public void removeObserver(FileAlterationObserver observer) {
    monitor.removeObserver(observer);
  }

  /**
   * 获取注册的所有观察器
   * @return
   */
  @Override
  public Iterable<FileAlterationObserver> getObservers() {
    return monitor.getObservers();
  }

  /**
   * 启动监测器
   */
  @Override
  public void start() {
    try {
      monitor.start();
    } 
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * 停止监测器
   */
  @Override
  public void stop() {
    try {
      monitor.stop();
    } 
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * 获取监测时间间隔
   */
  @Override
  public long getInterval() {
    return monitor.getInterval(); 
  }

}

五. 文件观察器

1. 接口:FileObserver.class

import java.io.File;

import org.apache.commons.io.monitor.FileAlterationListener;

/**
 * 文件观察器角色
 */
public interface FileObserver {
  
  /**
   * 添加监听器
   * @param listener
   */
  void addListener(final FileAlterationListener listener);
    
  /**
   * 删除监听器
   * @param listener
   */
  void removeListener(final FileAlterationListener listener);
    
  /**
   * 获取注册的监听器
   * @return
   */
  Iterable<FileAlterationListener> getListeners();  
  
  /**
   * 初始化观察器
   * @throws Exception
   */
  void initialize() throws Exception;  
  
  /**
   * 销毁观察器
   * @throws Exception
   */
  void destroy() throws Exception;  
  
  /**
   * 获取观察的目录
   * @return
   */
  File getDirectory();
  
  /**
   * 获取文件过滤器
   * 
   * @return
   */
  public FileFilter getFilter();
}

2. 实现类:FileObserverImpl.class

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOCase;
import org.apache.commons.io.monitor.FileAlterationListener;
import org.apache.commons.io.monitor.FileAlterationObserver;

/**
 * 文件观察器
 * 
 * 当有文件创建、删除、或变更动作时,则消息通知监听器
 */
public class FileObserverImpl extends FileAlterationObserver implements FileObserver{
  
  private static final long serialVersionUID = -7239227289538993830L;
  
  /**
   * 文件过滤器
   */
  private final FileFilter filter;
    
  /**
   * 设置要监听观察的目录,并设置文件过滤器和监听器,用以观察指定具有指定扩展名的文件
   * @param dir      观察监听的目录
   * @param filter    文件过滤器
   * @param listener    文件监听器
   */
  public FileObserverImpl(String dir, final FileFilter filter, 
                  FileAlterationListener listener) {
    super(dir, filter, (IOCase) null);
    addListener(listener); 
    
    this.filter = filter;
    
    File directory = new File(dir);
    
    // 如果目录不存在
    if(!directory.exists()) {
      try {
        FileUtils.forceMkdir(directory);
      } 
      catch (IOException e) {
        e.printStackTrace();
      }
    }
    // 如果存在的是文件
    else if(directory.exists() && directory.isFile()) {
      try {
        FileUtils.forceDelete(directory);
        FileUtils.forceMkdir(directory);
      } 
      catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
  
  /**
   * 添加监听器
   */
  @Override
  public void addListener(final FileAlterationListener listener) {
    super.addListener(listener);
  }

  /**
   * 移除监听器
   */
  @Override
  public void removeListener(final FileAlterationListener listener) {
    super.removeListener(listener);
  }

  /**
   * 获取观察者对象的所有监听器
   */
  @Override
  public Iterable<FileAlterationListener> getListeners() {
    return super.getListeners();
  }
  
  /**
   * 初始化文件观察者
   */
  @Override
  public void initialize() throws Exception {
    super.initialize();
  }

  /**
   * 销毁文件观察者
   */
  @Override
  public void destroy() throws Exception {
    super.destroy();
  }
  
  /**
   * 获取所观察的目录
   */
  @Override
  public File getDirectory() {
    return super.getDirectory();
  }

  /**
   * 获取文件过滤器
   * @return
   */
  public FileFilter getFilter() {
    return filter;
  }  
}

六. 文件监听器:FileListener.class

import java.io.File;

import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;

/**
 * 文件监听器
 */
public final class FileListener extends FileAlterationListenerAdaptor {
  
  /**
   * 文件创建时执行的动作
   */
  @Override
  public void onFileCreate(File file) {
    // To do something
  }
  
  /**
   * 文件删除(转移)时执行的动作
   */
  @Override
  public void onFileDelete(File file) {
    // To do something
  }
  
  /**
   * 文件内容改变时执行的动作
   */
  @Override
  public void onFileChange(File file) {
    // To do something
  }
  
  /**
   * 开始执行监听时执行的动作
   */
  @Override
  public void onStart(FileAlterationObserver observer) {
    // To do something
  }
  
  /**
   * 停止监听时执行的动作
   */
  @Override
  public void onStop(FileAlterationObserver observer) {
    // To do something
  }
}

七. 文件过滤器

1. 接口:FileFilter.class

/**
 * 文件过滤器角色,扩展自java.io.FileFilter
 */
public interface FileFilter extends java.io.FileFilter {
  
  /**
   * 获取定义的扩展名
   * 
   * @return
   */
  String[] getExtensions();
}

2. 实现类:FileFilterImpl.class

import java.io.File;

import org.apache.commons.io.FilenameUtils;

/**
 * 文件过滤器
 */
public class FileFilterImpl implements FileFilter{
  
  private String[] extensions;
  
  public FileFilterImpl(String... extensions) {
    this.extensions = extensions;
  }
  
  /**
   * 是否接受该文件
   */
  @Override
  public boolean accept(File pathname) {
    return FilenameUtils.isExtension(pathname.getName(), extensions); 
  }

  /**
   * 获取定义的扩展名
   * @return 
   */
  @Override
  public String[] getExtensions() {
    return extensions;
  }

}

以上这篇java实现文件变化监控的方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java使用BouncyCastle加密

    Java使用BouncyCastle加密

    本文主要介绍了Java使用BouncyCastle加密,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • java中设计模式(多例)的实例详解

    java中设计模式(多例)的实例详解

    这篇文章主要介绍了java中设计模式(多例)的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • Java使用ArrayList实现扑克牌的示例代码

    Java使用ArrayList实现扑克牌的示例代码

    学习了关于集合类的知识,我们可以做一个小项目来加深对集合类知识的学习!本文就来利用ArrayList实现扑克牌发牌洗牌效果,需要的可以参考一下
    2022-10-10
  • Mybatis关联查询遇到的坑-无主键的关联数据去重问题

    Mybatis关联查询遇到的坑-无主键的关联数据去重问题

    这篇文章主要介绍了Mybatis关联查询遇到的坑-无主键的关联数据去重问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 模拟简单Java线程池的方法详解

    模拟简单Java线程池的方法详解

    这篇文章主要为大家详细介绍了模拟简单Java线程池的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 在Java中实现可见性(visibility)的主要方法详解

    在Java中实现可见性(visibility)的主要方法详解

    这篇文章主要介绍了在Java中实现可见性(visibility)的主要方法详解,在Java中,使用关键字volatile和使用锁(如synchronized关键字或 java.util.concurrent包中的锁)来确保对共享变量的修改在多线程环境中能够正确地被其他线程所观察到,需要的朋友可以参考下
    2023-08-08
  • SpringMVC中RequestBody注解的List参数传递方式

    SpringMVC中RequestBody注解的List参数传递方式

    这篇文章主要介绍了SpringMVC中RequestBody注解的List参数传递方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • java中使用zxing批量生成二维码立牌

    java中使用zxing批量生成二维码立牌

    本篇文章主要介绍了java中使用zxing批量生成二维码立牌,非常具有实用价值,需要的朋友可以参考下。
    2016-12-12
  • Java泛型通配符的使用详解

    Java泛型通配符的使用详解

    本文主要介绍了Java泛型通配符的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • SpringBoot全局异常处理与定制404页面的方法

    SpringBoot全局异常处理与定制404页面的方法

    这篇文章主要介绍了SpringBoot全局异常处理与定制404页面的相关资料,本文通过实例代码图文相结合给大家介绍的非常详细,需要的朋友可以参考下
    2007-09-09

最新评论