Java文件实时监控Commons-io

今天看到一网友写的 Java 文件监控,实时监控文件加载 ,突然想到Commons-io中已有此功能的实现,先温习下 写个简单的Demo:

有三种方式:
1、java common.io    内部实现是遍历的方式,小文件夹的效率还好,比如我测试60G的目录,就很慢很慢了。(我使用这个)
2、jdk 7 的watch service    //经测试基本不可用。在一个40g的很深的目录下去新建和删除文件5分钟都没结果。主要原因是需要对每一个Path进行注册监控。
3、jnotify                   直接调用windows的api,效率很高,也很简单,推荐使用。
common.io
需要java.io 2.1及其以上版本。
版本地址如下:
http://commons.apache.org/io/download_io.cgi
Java代码  收藏代码
  1. package wy.util.filemonitor;  
  2.   
  3. import java.io.File;  
  4.   
  5. import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;  
  6. import org.apache.commons.io.monitor.FileAlterationObserver;  
  7. import org.apache.log4j.Logger;  
  8.   
  9. /** 
  10.  * 文件变化监听器 
  11.  *  
  12.  * 在Apache的Commons-IO中有关于文件的监控功能的代码. 文件监控的原理如下: 
  13.  * 由文件监控类FileAlterationMonitor中的线程不停的扫描文件观察器FileAlterationObserver, 
  14.  * 如果有文件的变化,则根据相关的文件比较器,判断文件时新增,还是删除,还是更改。(默认为1000毫秒执行一次扫描) 
  15.  *  
  16.  * @author wy 
  17.  *  
  18.  */  
  19. public class FileListener extends FileAlterationListenerAdaptor {  
  20.     private Logger log = Logger.getLogger(FileListener.class);  
  21.   
  22.     /** 
  23.      * 文件创建执行 
  24.      */  
  25.     @Override  
  26.     public void onFileCreate(File file) {  
  27.         log.info("[新建]:" + file.getAbsolutePath());  
  28.     }  
  29.   
  30.     /** 
  31.      * 文件创建修改 
  32.      */  
  33.     @Override  
  34.     public void onFileChange(File file) {  
  35.         log.info("[修改]:" + file.getAbsolutePath());  
  36.     }  
  37.   
  38.     /** 
  39.      * 文件删除 
  40.      */  
  41.     @Override  
  42.     public void onFileDelete(File file) {  
  43.         log.info("[删除]:" + file.getAbsolutePath());  
  44.     }  
  45.   
  46.     /** 
  47.      * 目录创建 
  48.      */  
  49.     @Override  
  50.     public void onDirectoryCreate(File directory) {  
  51.         log.info("[新建]:" + directory.getAbsolutePath());  
  52.     }  
  53.   
  54.     /** 
  55.      * 目录修改 
  56.      */  
  57.     @Override  
  58.     public void onDirectoryChange(File directory) {  
  59.         log.info("[修改]:" + directory.getAbsolutePath());  
  60.     }  
  61.   
  62.     /** 
  63.      * 目录删除 
  64.      */  
  65.     @Override  
  66.     public void onDirectoryDelete(File directory) {  
  67.         log.info("[删除]:" + directory.getAbsolutePath());  
  68.     }  
  69.   
  70.     @Override  
  71.     public void onStart(FileAlterationObserver observer) {  
  72.         // TODO Auto-generated method stub  
  73.         super.onStart(observer);  
  74.     }  
  75.   
  76.     @Override  
  77.     public void onStop(FileAlterationObserver observer) {  
  78.         // TODO Auto-generated method stub  
  79.         super.onStop(observer);  
  80.     }  
  81.   
  82. }  
Java代码  收藏代码
  1. package wy.util.filemonitor;  
  2.   
  3. import java.util.concurrent.TimeUnit;  
  4.   
  5. import org.apache.commons.io.filefilter.FileFilterUtils;  
  6. import org.apache.commons.io.monitor.FileAlterationMonitor;  
  7. import org.apache.commons.io.monitor.FileAlterationObserver;  
  8.   
  9. /** 
  10.  * 文件监控测试 
  11.  *  
  12.  * 在Apache的Commons-IO中有关于文件的监控功能的代码. 文件监控的原理如下: 
  13.  * 由文件监控类FileAlterationMonitor中的线程不停的扫描文件观察器FileAlterationObserver, 
  14.  * 如果有文件的变化,则根据相关的文件比较器,判断文件时新增,还是删除,还是更改。(默认为1000毫秒执行一次扫描) 
  15.  *  
  16.  * @author wy 
  17.  * 
  18.  */  
  19. public class FileMonitorTest {  
  20.   
  21.     /** 
  22.      * @param args 
  23.      */  
  24.     public static void main(String[] args) throws Exception{  
  25.         // 监控目录    
  26.         String rootDir = "F:\Resume";    
  27.         // 轮询间隔 5 秒    
  28.         long interval = TimeUnit.SECONDS.toMillis(5);  
  29.         // 创建一个文件观察器用于处理文件的格式    
  30.         FileAlterationObserver _observer = new FileAlterationObserver(    
  31.                                               rootDir,     
  32.                                               FileFilterUtils.and(    
  33.                                                FileFilterUtils.fileFileFilter(),    
  34.                                                FileFilterUtils.suffixFileFilter(".txt")),  //过滤文件格式    
  35.                                               null);    
  36.         FileAlterationObserver observer = new FileAlterationObserver(rootDir);  
  37.           
  38.         observer.addListener(new FileListener()); //设置文件变化监听器    
  39.         //创建文件变化监听器    
  40.         FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer);    
  41.         // 开始监控    
  42.         monitor.start();    
  43.     }  
  44.   
  45. }  

看下结果:


==============================================================================

那位网友的帖子:http://www.iteye.com/topic/1127281

还有位网友的帖子:http://dyccsxg.iteye.com/blog/618993

两位的思路都很相似,基本上是采用线程轮询的方式,但在校验文件更新的时候一位采用的文件校验码及hash码,另一位是采用文件的最后修改时间(lastModified() ).

原文地址:https://www.cnblogs.com/strive-study/p/4694409.html