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实现文件变化监控的方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java 使用线程监控文件目录变化的实现方法

    java 使用线程监控文件目录变化的实现方法 由于某种特殊的需求.弄了个使用线程监控文件目录变化的 代码基本如下.其中减去一些复杂的操作.只留下基本代码: package com.file; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; public

  • java使用WatchService监控文件夹示例

    通过java7提供的WatchService API 实现对文件夹的监控 package service; import config.Config; import java.io.IOException; import java.nio.file.*; import java.util.List; import java.util.concurrent.TimeUnit; public class WatchDirService { private WatchService watchServ

  • Java函数式编程(十二):监控文件修改

    使用flatMap列出子目录 前面已经看到如何列出指定目录下的文件了.我们再来看下如何遍历指定目录的直接子目录(深度为1),先实现一个简单的版本,然后再用更方便的flatMap()方法来实现. 我们先用传统的for循环来遍历一个指定的目录.如果子目录中有文件,就添加到列表里:否则就把子目录添加到列表里.最后,打印出所有文件的总数.代码在下面--这个是困难模式的. 复制代码 代码如下: public static void listTheHardWay() {      List<File> f

  • Java使用WatchService监控文件内容变化的示例

    场景 系统实现中经常需要能够感知配置文件的变化,然后及时更新上下文. 实现方案 自己起一个单独线程,定时加载文件,实现较简单,但是无法保证能够实时捕捉文件变化,同时耗CPU 使用commons-io中的 FileAlterationObserver,思想和上面类似,对比前后文件列表的变化,触发对应事件 JDK 1.7提供的WatchService,利用底层文件系统提供的功能 使用 WatchService WatchService用来监控一个目录是否发生改变,但是可以通过 WatchEvent

  • 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://w

  • Java实时监控日志文件并输出的方法详解

    前言 最近有一个银行数据漂白系统,要求操作人员在页面调用远端Linux服务器的shell,并将shell输出的信息保存到一个日志文件,前台页面要实时显示日志文件的内容.这个问题难点在于如何判断哪些数据是新增加的,通过查看JDK 的帮助文档, java.io.RandomAccessFile可以解决这个问题.为了模拟这个问题,编写LogSvr和 LogView类,LogSvr不断向mock.log日志文件写数据,而 LogView则实时输出日志变化部分的数据. 代码1:日志产生类 package

  • 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://ww

  • java获取文件扩展名的方法小结【正则与字符串截取】

    本文实例讲述了java获取文件扩展名的方法.分享给大家供大家参考,具体如下: 问题描述:  有一个String类型:String imageName = "zy.jpg"; 请问我如何截取"."后面的后辍名. 解决方法一:使用正则表达式 package csdnTest; import java.util.regex.*; public class CSDNTest { public static void main(String[] ss) { String s=

  • 让Java程序自动重启的实现方法(推荐)

    要让一个java程序自动重启还真不容易的,重启分两步,首先是结束程序,这个简单,只要运行System.exit()就可以了.然后是启动,这个就难了,这个时候程序都已经结束了,就像一个人死了就不可能再自己站起来,怎么办呢?让别人帮他扶起来,幸运的是,我也有这样的条件,我要重启的那个程序并不孤独,还有另一个java程序和它一起在运行,我只要让运行着的那个程序来启动它就可以了. 但运行着的那个程序它怎么知道要关闭的那个程序在什么时候关闭呢,如果不知道就不能贸然启动.只有让要关闭的那个程序在自杀前先通知

  • JAVA获取文件绝对路径的方法

    本文实例讲述了JAVA获取文件绝对路径的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: /** * 获取一个类的class文件所在的绝对路径. 这个类可以是JDK自身的类,也可以是用户自定义的类,或者是第三方开发包里的类. * 只要是在本程序中可以被加载的类,都可以定位到它的class文件的绝对路径. * * @param cls *            一个对象的Class属性 * @return 这个类的class文件位置的绝对路径. 如果没有这个类的定义,则返回nu

  • 常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数

    为了方便资源管理和提升工作效率,常用的js和css文件的加载应该放在一个统一文件里面完成,也方便后续的资源维护.所以我用js写了以下方法,存放在"sourceController.js"文件内. function sourceController(){ var root = ""; var cssCount = 0; // css加载计数器 var jsCount = 0; // js加载计数器 this.callfunc = null; // 回调函数 this.

  • js 获取本地文件及目录的方法(推荐)

    Javascript是网页制作中离不开的脚本语言,依靠它,一个网页的内容才生动活泼.富有朝气.但也许你还没有发现并应用它的一些更高级的功能吧?比如,对文件和文件夹进行读.写和删除,就象在VB.VC等高级语言中经常做的工作一样.怎么样,你是否需要了解这方面的知识?那就请跟我来,本文将详细描述如何使用Javascript语言进行文件操作. 一.功能实现核心:FileSystemObject 对象 其实,要在Javascript中实现文件操作功能,主要就是依靠FileSystemobject对象.在详

  • php原生导出excel文件的两种方法(推荐)

    第一种方法: $filename='文件名称'; $filetitle='你的标题'; if($_POST){ set_time_limit(10000): $title = ''; ini_set('memory_limit','300M'); header('Content-Type: application/vnd.ms-excel;charset=utf-8'); $name = $title.".xls"; header('Content-Disposition: attac

  • Java读取文件的简单实现方法

    本文实例讲述了Java读取文件的简单实现方法,非常实用.分享给大家供大家参考之用.具体方法如下: 这是一个简单的读取文件的代码,并试着读取一个log文件,再输出. 主要代码如下: import java.io.*; public class FileToString { public static String readFile(String fileName) { String output = ""; File file = new File(fileName); if(file.

  • java 字符串截取的三种方法(推荐)

    众所周知,java提供了很多字符串截取的方式.下面就来看看大致有几种. 1.split()+正则表达式来进行截取. 将正则传入split().返回的是一个字符串数组类型.不过通过这种方式截取会有很大的性能损耗,因为分析正则非常耗时. String str = "abc,12,3yy98,0"; String[] strs=str.split(","); for(int i=0,len=strs.length;i<len;i++){ System.out.pri

随机推荐