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); } } } }}?