首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java听文件目录的变更

2012-11-01 
Java听文件目录的变化?import java.io.Fileimport java.io.FileInputStreamimport java.io.InputStreamR

Java听文件目录的变化

?

import java.io.File;import java.io.FileInputStream;import java.io.InputStreamReader;import java.io.Reader;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;/** * 监听文件目录的变化 * @author liupengchao * */public class DirMonitor implements Runnable {/**     * just for test     *     * @param args     */    public static void main(String[] args) {        DirMonitor dirMonitor = new DirMonitor("C:\\lpc", 1);        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)+"---"+key);                File file = new File(nowDirFileMap.get(key));                Reader reader = null;                try {                    System.out.println("读取的文件内容:");                    // 一次读一个字符                    reader = new InputStreamReader(new FileInputStream(file));                    int tempchar;                    while ((tempchar = reader.read()) != -1) {                        // 对于windows下,\r\n这两个字符在一起时,表示一个换行。                        // 但如果这两个字符分开显示时,会换两次行。                        // 因此,屏蔽掉\r,或者屏蔽\n。否则,将会多出很多空行。                        if (((char) tempchar) != '\r') {                            System.out.print((char) tempchar);                        }                    }                    reader.close();                } catch (Exception e) {                    e.printStackTrace();                }            }        }    }    /**     * 得到删除的文件及文件夹,并删除已经不存在的文件信息     */    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];              //  System.out.println("pname------->"+pname);                File tempFile = new File(pname);                if (tempFile.isDirectory()) {                    dirFileMap.put(pname,pname);                    totalScan(tempFile, dirFileMap);                } else {                    // 不相同的文件夹下,存放的文件可能名字相同,但是同一路径下的文件肯定不会相同,                    // 所以采用全路径做为key值                    dirFileMap.put(pname, pname);                }            }        }    }}
?

热点排行