Java 如何監控檔案目錄的變化 【轉】

daditao發表於2014-01-08
imp
ort java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * Description:監控某個檔案路徑下的變化
 * </p>
 *
 * @author imasmallbird
 * @version $Revision 1.1 $ 2009-10-10 下午01:14:26
 */
public class DirMonitor implements Runnable {

    /**
     * just for test
     *
     * @param args
     */
    public static void main(String[] args) {
        DirMonitor dirMonitor = new DirMonitor("D:\\temp", 5);
        dirMonitor.run();
    }

    /**
     * 監控的檔案路徑
     */
    private String dir;

    /**
     * 原有檔案資訊
     */
    private Map<String, String> oldDirFileMap;

    /**
     * 掃描間隔時間以秒為單位
     */
    private int period;

    /**
     * 初始化相關資料
     */
    public DirMonitor(String dir, int period) {
        this.dir = dir;
        this.period = period;
        this.oldDirFileMap = new HashMap<String, String>();
    }

    /**
     * 展示原有檔案
     */
    private void displayNowFile() {
        System.out.println(dir + "路徑原有檔案目錄如下:\n");
        Set set = oldDirFileMap.keySet();
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.println(oldDirFileMap.get(iterator.next()));
        }
        System.out.println("========================");
    }

    /**
     * 得到增加的檔案及資料夾,並增加到已有的檔案資訊中
     */
    private void getAddedFile(Map<String, String> nowDirFileMap) {
        for (Iterator<String> iterator = nowDirFileMap.keySet().iterator(); iterator.hasNext();) {
            String key = iterator.next();
            if (null == oldDirFileMap.get(key)) {
                oldDirFileMap.put(key, nowDirFileMap.get(key));
                System.out.println("新增" + nowDirFileMap.get(key));
            }
        }
    }

    /**
     * 得到刪除的檔案及資料夾,並刪除已經不存在的檔案資訊
     */
    private void getDeletedFile(Map<String, String> nowDirFileMap) {
        for (Iterator<String> iterator = oldDirFileMap.keySet().iterator(); iterator.hasNext();) {
            String key = iterator.next();
            if (null == nowDirFileMap.get(key)) {
                System.out.println("刪除" + oldDirFileMap.get(key));
                iterator.remove();
                oldDirFileMap.remove(key);
            }
        }
    }

    /**
     * 執行緒的執行。對於修改檔案的情況,則視為刪除與增加兩個操作。
     */
    public void run() {

        boolean isError = false;
        File file = new File(dir);
        // 初始化開始監控時的檔案路徑狀態
        totalScan(file, oldDirFileMap);
        // 展示原有路徑下的檔案資訊
        displayNowFile();
        while (!isError) {
            try {
                Thread.sleep(period * 1000);
                // 指定時間間間隔後掃描路徑
                Map<String, String> nowDirFileMap = new HashMap<String, String>();
                totalScan(file, nowDirFileMap);
                // 得到刪除的檔案及資料夾
                getDeletedFile(nowDirFileMap);
                // 得到新增的檔案及資料夾
                getAddedFile(nowDirFileMap);
                // 注意:由於涉及到修改,所以一定要先檢測刪除的檔案,然後再檢測新增加的檔案

            }
            catch (InterruptedException e) {
                System.out.println("對指定的檔案路徑進行監控時產生異常,異常資訊為:" + e.getMessage());
                isError = true;
            }
        }
    }

    /**
     * 遞迴掃描整個路徑
     *
     * @param dir
     * @param ndir
     * @param dirFileMap
     *            存放掃描結果
     */
    private void totalScan(File file, Map<String, String> dirFileMap) {

        String[] fileList = file.list();
        // 判斷是否為空目錄
        if (null != fileList) {
            for (int i = 0; i < fileList.length; i++) {
                String pname = file.getAbsolutePath() + "\\" + fileList[i];
                File tempFile = new File(pname);
                if (tempFile.isDirectory()) {
                    dirFileMap.put(pname, "資料夾:\t" + pname);
                    totalScan(tempFile, dirFileMap);
                } else {
                    // 不相同的資料夾下,存放的檔案可能名字相同,但是同一路徑下的檔案肯定不會相同,
                    // 所以採用全路徑做為key值
                    dirFileMap.put(pname, "檔案:\t" + pname);
                }
            }
        }
    }
}

相關文章