java實現文件變化監控


此文章是基於  搭建Jquery+SpringMVC+Spring+Hibernate+MySQL平台

 

一. 相關文件介紹

  1. applicationInterface.xml,spring配置文件,可設置監測的文件夾、掃描時間、指定監控哪些擴展名的文件

<?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"
    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">
    
    <!-- 文件監測器  -->    
    <bean id="monitor"
        class="com.ims.interfaces.file.monitor.FileMonitorImpl">
    
        <constructor-arg index="0" value="10000" />                    <!-- 監測時間間隔,單位:毫秒 -->
        <constructor-arg index="1" ref="observer" />                <!-- 文件觀察器  -->
    </bean>        
    
    <!-- 文件觀察器  -->        
    <bean id="observer"
        class="com.ims.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.ims.interfaces.file.monitor.FileListener"/>
    
    <!-- 文件過濾器  -->        
    <bean id="filter"
        class="com.ims.interfaces.file.monitor.FileFilterImpl">        
        <!-- 
            指定文件擴展名,只有指定的擴展名文件會被處理。
            不同的擴展名間以  "," 間隔,如:xml,txt,bak 
        -->
        <constructor-arg index="0" value="xml"/>        
    </bean>
</beans>
View Code


  2. SpringContextLoaderListener.java,spring上下文加載監聽器,服務運行時啟動掃描,結束時關閉掃描

package com.ims.web;

import javax.servlet.ServletContextEvent;

import org.springframework.web.context.ContextLoaderListener;

import com.ims.interfaces.file.monitor.FileMonitor;

/**
 * Spring場景加載監聽器,用於加載/銷毀Spring場景
 */
public class SpringContextLoaderListener extends ContextLoaderListener {

    public SpringContextLoaderListener() {
        super();
    }
    

    @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);
    }

}
View Code


  3. web.xml,web工程配置文件

    如果存在如下代碼,則去掉

<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>

    然后添加上如下代碼:

<listener> <listener-class>com.ims.web.SpringContextLoaderListener</listener-class> </listener>


  4. 文件監測器

    4.1. 接口:FileMonitor.java

package com.ims.interfaces.file.monitor;

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();    
    
}
View Code

    4.2. 實現類:FileMonitorImpl.java

package com.ims.interfaces.file.monitor;

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(); 
    }

}
View Code


  5. 文件觀察器

    5.1. 接口:FileObserver.java

package com.ims.interfaces.file.monitor;

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();
}
View Code

    5.2. 實現類:FileObserverImpl.java

package com.ims.interfaces.file.monitor;

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;
    }    
}
View Code


  6. 文件監聽器:FileListener.java

package com.ims.interfaces.file.monitor;

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
        System.out.println("Create file: "+file.getName());
    }
    
    /**
     * 文件刪除(轉移)時執行的動作
     */
    @Override
    public void onFileDelete(File file) {
        // To do something
        System.out.println("Delete file: "+file.getName());
    }
    
    /**
     * 文件內容改變時執行的動作
     */
    @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
    }
}
View Code


  7. 文件過濾器

    7.1. 接口:FileFilter.java

package com.ims.interfaces.file.monitor;

/**
 * 文件過濾器角色,擴展自java.io.FileFilter
 */
public interface FileFilter extends java.io.FileFilter {
    
    /**
     * 獲取定義的擴展名
     * 
     * @return
     */
    String[] getExtensions();
}
View Code

      7.2. 實現類:FileFilterImpl.java

package com.ims.interfaces.file.monitor;

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;
    }

}
View Code


二. 測試

  在 "D:\UploadDir" 目錄下,新建或刪除xml格式的文件,FileListener.java 會在后台打印出文件的名字

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM