你的位置:首页 > Java教程

[Java教程]java实现文件变化监控


一. spring配置文件:application.

 1 <??> 2 <beans ="http://www.springframework.org/schema/beans" ="http://www.w3.org/2001/   3   ="http://www.springframework.org/schema/tx" ="http://www.springframework.org/schema/aop" 4   ="http://www.springframework.org/schema/context" ="http://www.directwebremoting.org/schema/spring-dwr" 5   ="http://cxf.apache.org/jaxrs" 6   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 7     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd 8     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 9     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd10     http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd11     http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">12   13   <!-- 文件监测器 -->  14   <bean id="monitor"15     class="com.interfaces.file.monitor.FileMonitorImpl">16   17     <constructor-arg index="0" value="10000" />          <!-- 监测时间间隔,单位:毫秒 -->18     <constructor-arg index="1" ref="observer" />        <!-- 文件观察器 -->19   </bean>    20   21   <!-- 文件观察器 -->    22   <bean id="observer"23     class="com.interfaces.file.monitor.FileObserverImpl">24     25     <constructor-arg index="0" value="D:\\UploadDir"/>      <!-- 观察的目录 -->26     <constructor-arg index="1" ref="filter"/>          <!-- 文件过滤器-->27     <constructor-arg index="2" ref="listener"/>          <!-- 文件监听器 -->28   </bean>29   30   <!-- 文件监听器 -->  31   <bean id="listener"32     class="com.interfaces.file.monitor.FileListener"/>33   34   <!-- 文件过滤器 -->    35   <bean id="filter"36     class="com.interfaces.file.monitor.FileFilterImpl">    37     <!-- 38       指定文件扩展名,只有指定的扩展名文件会被处理。39       不同的扩展名间以 "," 间隔,如:40     -->41     <constructor-arg index="0" value="/>    42   </bean>43 </beans>

View Code

 

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

 1 import javax.servlet.ServletContextEvent; 2  3 import org.springframework.web.context.ContextLoaderListener; 4  5 public class SpringContextLoaderListener extends ContextLoaderListener{ 6    7   @Override 8   public void contextInitialized(ServletContextEvent event) { 9     super.contextInitialized(event);10     11     FileMonitor scanner = getScanner();12     13     // 启动目录扫描器14     scanner.start();15   }16   17   @Override18   public void contextDestroyed(ServletContextEvent event) {19     FileMonitor scanner = getScanner();20     21     // 关闭目录扫描器22     scanner.stop();23     24     super.contextDestroyed(event);25   }26   27   /**28    * 获取目录扫描器29    * @return30   */31   private FileMonitor getScanner() {32     return getCurrentWebApplicationContext().getBean(FileMonitor.class);33   }34 }

View Code

 

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

 1 <??> 2 <web-app ="http://www.w3.org/2001/ ="http:// xsi:schemaLocation="http://java.sun.com/ version="2.4"> 3  <context-param> 4   <param-name>contextConfigLocation</param-name> 5   <param-value> 6       classpath:application. 7   </param-value> 8  </context-param> 9  <listener>10   <listener-class>com.web.SpringContextLoaderListener</listener-class>11  </listener>12   13 </web-app>

View Code


四. 文件监测器

  1. 接口:FileMonitor.class

 1 import org.apache.commons.io.monitor.FileAlterationObserver; 2  3 /** 4  * 文件监测器角色 5 */ 6 public interface FileMonitor { 7  8   /** 9    * 注册观察器10    * @param observer  观察器11   */12   void addObserver(FileAlterationObserver observer);13     14   /**15    * 删除观察器16    * @param observer  观察器17   */18   void removeObserver(FileAlterationObserver observer);  19   20   /**21    * 获取注册的所有观察器22    * @return  观察器集合23   */24   Iterable<FileAlterationObserver> getObservers();  25   26   /**27    * 启动监测器28   */29   void start();  30   31   /**32    * 停止监测器33   */34   void stop();  35   36   /**37    * 获取监测间隔时间38    * @return  间隔时间(单位:毫秒)39   */40   long getInterval();  41   42 }

View Code


  2. 实现类:FileMonitorImpl.class

 1 import java.util.concurrent.ThreadFactory; 2  3 import org.apache.commons.io.monitor.FileAlterationMonitor; 4 import org.apache.commons.io.monitor.FileAlterationObserver; 5 import org.apache.commons.lang3.concurrent.BasicThreadFactory; 6  7 /** 8  * 监测器,监测时间间隔,设置文件观察器 9 */ 10 public class FileMonitorImpl implements FileMonitor{ 11  12   private final FileAlterationMonitor monitor; 13    14   /** 15    * 监测器线程名称 16   */ 17   private static final String MONITOR_THREAD_NAME = "File MONITOR Daemon"; 18      19   /** 20    * 监测器线程Daemon标记 21   */ 22   private static final boolean DAEMON = false; 23    24    25   /** 26    * 定义监测时间间隔、文件观察器 27    * @param interval  监测时间间隔 28    * @param observer  文件观察者 29   */ 30   FileMonitorImpl(int interval, final FileAlterationObserver observer) { 31     this(interval, observer,  32       new BasicThreadFactory.Builder(). 33           namingPattern(MONITOR_THREAD_NAME).daemon(DAEMON).build());     34   }   35    36   /** 37    * 定义监测时间间隔、文件观察器和线程工厂 38    * @param interval  监测时间间隔 39    * @param observer  文件观察器 40    * @param factory  线程工厂 41   */ 42   FileMonitorImpl(int interval, final FileAlterationObserver observer,  43              final ThreadFactory factory) {     44     this.monitor = new FileAlterationMonitor(interval, new FileAlterationObserver[] { observer }); 45     monitor.setThreadFactory(factory);     46   }  47    48   /** 49    * 添加文件观察器 50    * @param observer 51   */ 52   @Override 53   public void addObserver(FileAlterationObserver observer) { 54     monitor.addObserver(observer); 55   } 56  57   /** 58    * 删除文件观察器  59    * @param observer 60   */ 61   @Override 62   public void removeObserver(FileAlterationObserver observer) { 63     monitor.removeObserver(observer); 64   } 65  66   /** 67    * 获取注册的所有观察器 68    * @return 69   */ 70   @Override 71   public Iterable<FileAlterationObserver> getObservers() { 72     return monitor.getObservers(); 73   } 74  75   /** 76    * 启动监测器 77   */ 78   @Override 79   public void start() { 80     try { 81       monitor.start(); 82     }  83     catch (Exception e) { 84       e.printStackTrace(); 85     } 86   } 87  88   /** 89    * 停止监测器 90   */ 91   @Override 92   public void stop() { 93     try { 94       monitor.stop(); 95     }  96     catch (Exception e) { 97       e.printStackTrace(); 98     } 99   }100 101   /**102    * 获取监测时间间隔103   */104   @Override105   public long getInterval() {106     return monitor.getInterval(); 107   }108 109 }

View Code


五. 文件观察器

  1. 接口:FileObserver.class

 1 import java.io.File; 2  3 import org.apache.commons.io.monitor.FileAlterationListener; 4  5 /** 6  * 文件观察器角色 7 */ 8 public interface FileObserver { 9   10   /**11    * 添加监听器12    * @param listener13   */14   void addListener(final FileAlterationListener listener);15     16   /**17    * 删除监听器18    * @param listener19   */20   void removeListener(final FileAlterationListener listener);21     22   /**23    * 获取注册的监听器24    * @return25   */26   Iterable<FileAlterationListener> getListeners();  27   28   /**29    * 初始化观察器30    * @throws Exception31   */32   void initialize() throws Exception;  33   34   /**35    * 销毁观察器36    * @throws Exception37   */38   void destroy() throws Exception;  39   40   /**41    * 获取观察的目录42    * @return43   */44   File getDirectory();45   46   /**47    * 获取文件过滤器48    * 49    * @return50   */51   public FileFilter getFilter();52 }

View Code

  

  2. 实现类:FileObserverImpl.class

 1 import java.io.File; 2 import java.io.IOException; 3  4 import org.apache.commons.io.FileUtils; 5 import org.apache.commons.io.IOCase; 6 import org.apache.commons.io.monitor.FileAlterationListener; 7 import org.apache.commons.io.monitor.FileAlterationObserver; 8  9 /** 10  * 文件观察器 11  *  12  * 当有文件创建、删除、或变更动作时,则消息通知监听器 13 */ 14 public class FileObserverImpl extends FileAlterationObserver implements FileObserver{ 15    16   private static final long serialVersionUID = -7239227289538993830L; 17    18   /** 19    * 文件过滤器 20   */ 21   private final FileFilter filter; 22      23   /** 24    * 设置要监听观察的目录,并设置文件过滤器和监听器,用以观察指定具有指定扩展名的文件 25    * @param dir      观察监听的目录 26    * @param filter    文件过滤器 27    * @param listener    文件监听器 28   */ 29   public FileObserverImpl(String dir, final FileFilter filter,  30                   FileAlterationListener listener) { 31     super(dir, filter, (IOCase) null); 32     addListener(listener);  33      34     this.filter = filter; 35      36     File directory = new File(dir); 37      38     // 如果目录不存在 39     if(!directory.exists()) { 40       try { 41         FileUtils.forceMkdir(directory); 42       }  43       catch (IOException e) { 44         e.printStackTrace(); 45       } 46     } 47     // 如果存在的是文件 48     else if(directory.exists() && directory.isFile()) { 49       try { 50         FileUtils.forceDelete(directory); 51         FileUtils.forceMkdir(directory); 52       }  53       catch (IOException e) { 54         e.printStackTrace(); 55       } 56     } 57   } 58    59   /** 60    * 添加监听器 61   */ 62   @Override 63   public void addListener(final FileAlterationListener listener) { 64     super.addListener(listener); 65   } 66  67   /** 68    * 移除监听器 69   */ 70   @Override 71   public void removeListener(final FileAlterationListener listener) { 72     super.removeListener(listener); 73   } 74  75   /** 76    * 获取观察者对象的所有监听器 77   */ 78   @Override 79   public Iterable<FileAlterationListener> getListeners() { 80     return super.getListeners(); 81   } 82    83   /** 84    * 初始化文件观察者 85   */ 86   @Override 87   public void initialize() throws Exception { 88     super.initialize(); 89   } 90  91   /** 92    * 销毁文件观察者 93   */ 94   @Override 95   public void destroy() throws Exception { 96     super.destroy(); 97   } 98    99   /**100    * 获取所观察的目录101   */102   @Override103   public File getDirectory() {104     return super.getDirectory();105   }106 107   /**108    * 获取文件过滤器109    * @return110   */111   public FileFilter getFilter() {112     return filter;113   }  114 }

View Code


六. 文件监听器:FileListener.class

 1 import java.io.File; 2  3 import org.apache.commons.io.monitor.FileAlterationListenerAdaptor; 4 import org.apache.commons.io.monitor.FileAlterationObserver; 5  6 /** 7  * 文件监听器 8 */ 9 public final class FileListener extends FileAlterationListenerAdaptor {10   11   /**12    * 文件创建时执行的动作13   */14   @Override15   public void onFileCreate(File file) {16     // To do something17   }18   19   /**20    * 文件删除(转移)时执行的动作21   */22   @Override23   public void onFileDelete(File file) {24     // To do something25   }26   27   /**28    * 文件内容改变时执行的动作29   */30   @Override31   public void onFileChange(File file) {32     // To do something33   }34   35   /**36    * 开始执行监听时执行的动作37   */38   @Override39   public void onStart(FileAlterationObserver observer) {40     // To do something41   }42   43   /**44    * 停止监听时执行的动作45   */46   @Override47   public void onStop(FileAlterationObserver observer) {48     // To do something49   }50 }

View Code


七. 文件过滤器

  1. 接口:FileFilter.class

 1 /** 2  * 文件过滤器角色,扩展自java.io.FileFilter 3 */ 4 public interface FileFilter extends java.io.FileFilter { 5    6   /** 7    * 获取定义的扩展名 8    *  9    * @return10   */11   String[] getExtensions();12 }

View Code

  

  2. 实现类:FileFilterImpl.class

 1 import java.io.File; 2  3 import org.apache.commons.io.FilenameUtils; 4  5 /** 6  * 文件过滤器 7 */ 8 public class FileFilterImpl implements FileFilter{ 9   10   private String[] extensions;11   12   public FileFilterImpl(String... extensions) {13     this.extensions = extensions;14   }15   16   /**17    * 是否接受该文件18   */19   @Override20   public boolean accept(File pathname) {21     return FilenameUtils.isExtension(pathname.getName(), extensions); 22   }23 24   /**25    * 获取定义的扩展名26    * @return 27   */28   @Override29   public String[] getExtensions() {30     return extensions;31   }32 33 }

View Code