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() ).

  • 相关阅读:
    解决SharePoint 文档库itemadded eventhandler导致的上传完成后,编辑页面保持报错的问题,错误信息为“该文档已经被编辑过 the file has been modified by...”
    解决SharePoint 2013 designer workflow 在发布的报错“负载平衡没有设置”The workflow files were saved but cannot be run.
    随机实例,随机值
    Spring4笔记
    struts2笔记(3)
    struts2笔记(2)
    获取文本的编码类型(from logparse)
    FileUtil(from logparser)
    DateUtil(SimpleDateFormat)
    struts2笔记
  • 原文地址:https://www.cnblogs.com/strive-study/p/4694409.html
Copyright © 2011-2022 走看看