zoukankan      html  css  js  c++  java
  • 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() ).

  • 相关阅读:
    net异步编程
    二维码的生成细节和原理
    4605 Magic Ball Game
    (Java实现) 子集和问题
    (Java实现) 组合的输出
    (Java实现) 自然数的拆分
    (Java实现) 装载问题
    (Java实现) 整数区间
    (Java实现) 最佳调度问题
    (Java实现) 最佳调度问题
  • 原文地址:https://www.cnblogs.com/strive-study/p/4694409.html
Copyright © 2011-2022 走看看