1. 程式人生 > >工具類commons-io的檔案監控

工具類commons-io的檔案監控

一、前言:

使用Commons-io的monitor下的相關類可以處理對檔案進行監控,它採用的是觀察者模式來實現的

1、可以監控資料夾的建立、刪除和修改

2、可以監控檔案的建立、刪除和修改

3、採用的是觀察者模式來實現的

4、採用執行緒去定時去刷現檢測檔案的變化情況

二、程式碼分析

(一)、FileAlterationListener分析,提供了檢測資料夾和檔案的變化回撥函式的介面,觀察模式回撥的介面

        1、提供了資料夾的建立、刪除和修改的介面

        2、提供了檔案的建立、刪除和修改的介面

(二)、FileAlterationListenerAdaptor實現了FileAlterationListener的介面,只是空的實現,可以根據使用者的使用情況來處理檔案的變化

(三)、FileAlterationObserver重點的觀察者模式的類

       1、提供對某路徑下檔案監控

       2、使用FileFilter來控制對那些檔案進行監控,在實際的使用情況是使用FileFilterUtils來控制,他設定了新增一系列的FileFilter

       3、IOCase可以用來對系統的判斷,使用是Unix和Windows進行不同的處理,Unix支援檔名的大小寫,Windows不區分檔案的大小寫

(四)、FileAlterationMonitor類

      1、它繼承了Runnable介面

      2、它檢測檔案的過程是採用一個執行緒去不停的進行檔案的檢測

      3、精髓之處,檔案的內容的改變處理過程

            對於檔案的變化有點不太準確,只是判斷檔名、檔案大小、檔案的修改日期來判斷

( 五)、FileEntry類

      1、提供了資料夾和資料夾下檔案的層級結構

      2、提供了檔案是否改變了,採用了備忘錄模式(形式上有點,沒有很嚴格的控制),將上一次的狀態進行儲存,在比較的時候重新讀取新的狀態,

            比較完後備忘錄重新將新的狀態進行儲存。

(六)、Common-io中提供一序列的檔案的FileFilter類,使用是可以看情況檢視原始碼

      1、提供了FileFilterUtils來提供新增一些列的FileFilter

      2、新增一序列的FileFilter的實現是使用AndFileFilter來實現的

      3、提供相識的OrFileFilter和NotFileFilter

三、讀原始碼的測試程式碼

package com.yezi.leran.commons.io;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;

import java.io.File;
import java.io.FileFilter;

/**
 * Created by yezi on 2014/6/1.
 */
public class FileAlterationObserverTest {

    public static void main(String []args) throws Exception{


        FileAlterationObserverTest fileAlter = new FileAlterationObserverTest();
        fileAlter.test();
        String filePath = "C:/Users/yezi/Desktop/test/";
        File file = new File(filePath);
        FileUtils.deleteDirectory(file);
        file.mkdirs();
        //File txtFile = new File(filePath+File.separator+System.currentTimeMillis()+".txt");
        //FileUtils.touch(txtFile);
//        File txtFile = new File("C:/Users/yezi/Desktop/test/1401629335839.txt");
//        txtFile.deleteOnExit();
//        FileUtils.touch(txtFile);

//        File newFile = new File(filePath+File.separator+System.currentTimeMillis());
//        newFile.mkdirs();

        boolean flag = true;
        while(flag){
            /***測試檔案的變化程式碼*/
//            File newFileTxt = new File(filePath+File.separator+System.currentTimeMillis()+".txt");
//            FileUtils.touch(newFileTxt);
//            Thread.sleep(2000);
//            FileUtils.write(newFileTxt,"1",true);
//            Thread.sleep(2000);
//            newFileTxt.delete();



            /****測試資料夾的變化程式碼***/
            File newFile = new File(filePath+File.separator+System.currentTimeMillis());
            newFile.mkdir();
            Thread.sleep(2000);
            File newFileTxt = new File(newFile.getAbsolutePath()+File.separator+System.currentTimeMillis()+".txt");
            FileUtils.touch(newFileTxt);
        }
    }

    public void test() throws Exception{
        String filePath = "C:/Users/yezi/Desktop/test/";
        FileFilter filter = FileFilterUtils.and(new MyFileFilter());
        FileAlterationObserver fileAlterationObserver = new FileAlterationObserver(filePath,filter);
        fileAlterationObserver.addListener(new FileAlterationListenerAdaptor() {

            @Override
            public void onStart(FileAlterationObserver observer) {
                System.out.println("start on file");
                super.onStart(observer);
            }

            @Override
            public void onDirectoryDelete(File directory) {
                System.out.println("delete file");
                super.onDirectoryDelete(directory);
            }

            @Override
            public void onDirectoryCreate(File directory) {
                System.out.println("create file");
                super.onDirectoryCreate(directory);
            }

            @Override
            public void onDirectoryChange(File directory) {
                System.out.println("change file");
                super.onDirectoryChange(directory);
            }

            @Override
            public void onFileCreate(File file) {
                System.out.println("file create");
                super.onFileCreate(file);
            }

            @Override
            public void onFileDelete(File file) {
                System.out.println("file delete");
                super.onFileDelete(file);
            }

            @Override
            public void onFileChange(File file) {
                System.out.println("file change");
                super.onFileChange(file);
            }
        });
        FileAlterationMonitor fileAlterationMonitor =  new FileAlterationMonitor(1000);
        fileAlterationMonitor.addObserver(fileAlterationObserver);
        fileAlterationMonitor.start();
    }
}

/***
 * 自定義的檔案過濾器
 */
class MyFileFilter implements IOFileFilter {

    @Override
    public boolean accept(File file) {
//        String extension = FilenameUtils.getExtension(file.getAbsolutePath());
//        if(extension!=null&&extension.equals("txt"))
//           return true;
//        return false;
        return true;
    }

    @Override
    public boolean accept(File dir, String name) {
        //System.out.println("dir:"+dir+"----->"+name);
        return true;
    }
}


weu