Java 如何监控文件目录的变化 【转】

imp
ort java.io.File;
imp ort java.util.HashMap;
imp ort java.util.Iterator;
imp ort java.util.Map;
imp ort 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);
                }
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值