Java 實現對文件系統的監控


在開發中經常會用到監控文件或是目錄的狀態,如果你還在手寫輪巡掃描文件的話,那你久out了。

1. Commons io為我們提供了一套可靠、高性能的一套文件系統監控API

1.1. 需要的jar包如下,具體版本可根據自己需要選取:

  • commons-logging-1.1.1.jar
  • log4j-1.2.15.jar

1.2. 在文件監控系統的中,首先要理解幾個角色:

  • Observer:觀察者,擁有文件路徑、文件過濾器、文件比較器(監控器用它來判斷文件的狀態變化:新增、修改、刪除、等等),可以向他添加相關的監聽器;
  • Listener:監聽器,當文件系統發生變化時,將會執行它的相關方法。其實,在文件狀態發生變化時,觀察者會根據文件比較器來拿到文件的變化狀態,根據變化狀態的不同來調用監聽器中不同的方法;
  • Monitor:監控器,可設置監控文件系統的時間間隔、文件觀察者等信息。

1.3. 代碼實現步驟如下:

1.3.1. 實現監聽器

import java.io.File;

import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 文件監聽器
 * @author leocook(leocook@163.com)
 * @version 1.0
 * @date 2014-06-30
 */
public class MyFileListener extends FileAlterationListenerAdaptor {
    private static Log log = LogFactory.getLog(MyFileListener.class);
    /**
     * 目錄發生變化
     * @param directory 發生變化的目錄
     */
    @Override
    public void onDirectoryChange(File directory) {
        super.onDirectoryChange(directory);
        log.info("文件夾改變:" +directory.getAbsolutePath());
    }

    /**
     * 新建目錄
     * @param directory 被新建的目錄
     */
    @Override
    public void onDirectoryCreate(File directory) {
        super.onDirectoryCreate(directory);
        log.info("新建目錄:" +directory.getAbsolutePath());
    }

    /**
     * 刪除目錄
     * @param directory 被刪除目錄
     */
    @Override
    public void onDirectoryDelete(File directory) {
        super.onDirectoryDelete(directory);
        log.info("刪除目錄:" +directory.getAbsolutePath());
    }

    /**
     * 文件發生變化
     * @param file 發生變化的文件
     */
    @Override
    public void onFileChange(File file) {
        super.onFileChange(file);
        log.info("修改文件:" +file.getAbsolutePath());
    }

    /**
     * 新建文件
     * @param file 被新建的文件
     */
    @Override
    public void onFileCreate(File file) {
        super.onFileCreate(file);
        log.info("新建文件:"+file.getAbsolutePath());
    }

    /**
     * 刪除文件
     * @param file 被刪除的文件
     */
    @Override
    public void onFileDelete(File file) {
        super.onFileDelete(file);
        log.info("刪除文件:" +file.getAbsolutePath());
    }
    
    /**
     * 檢查文件開始
     * @param observer 文件觀察者
     */
    @Override
    public void onStart(FileAlterationObserver observer) {
        super.onStart(observer);
//        log.info("開始檢查...");
    }

    /**
     * 檢查文件結束
     * @param observer 文件觀察者
     */
    @Override
    public void onStop(FileAlterationObserver observer) {
        super.onStop(observer);
//        log.info("結束檢查...");
    }
}

 

1.3.2. 觀察者、監控器的調用

import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 文件系統監測測試類
 * @author leocook(leocook@163.com)
 * @version 1.0
 * @date 2014-06-30
 */
public class Main {
    private static Log log = LogFactory.getLog(Main.class);
    
    /**
     * 測試文件系統監測
     * @param String[] args
     */
    public static void main(String[] args) {
        long interval = 1000;
        
        final String path = "/home/leocook/test";
        FileAlterationObserver observer = null;
        
        try {
            observer = new FileAlterationObserver(path, null, null);
            //添加監聽器
            observer.addListener(new MyFileListener());
            
            FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer);
            monitor.start();
        } catch (Exception e) {
            log.error("Exception", e);
        }
    }
}

 1.4. Commons io包中對文件系統監控體系中,還有類org.apache.commons.io.monitor.FileEntry,關於它的具體用法筆者不再一一介紹。

 1.5. 參考鏈接

  • http://blog.csdn.net/xiaoyezi1001/article/details/28095281


免責聲明!

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



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