java 文件监听器_观察者模式实现java的文件监听器

发布于:2021-12-04 07:56:08

package study.filemoniter;


import java.io.File;


import java.util.Map;


import java.util.Observable;


import java.util.Set;


import java.util.concurrent.ConcurrentHashMap;


import org.apache.commons.lang.StringUtils;


/**


*文件监听器 观察者模式,该监听器是一个被观察者


* @author dWX207527


*


*/


public class FileMoniter extends Observable implements Runnable


{


/**


* 是否启动监听


*/


private boolean monitorFlag = true;


/**


* 5秒监听一次


*/


private int interval = 5000;


/**


* 文件容器 key放文件的名称,value放文件的最后修改时间


*/


private Map fileMap = new ConcurrentHashMap();


/**


* 线程方法


*/


@Override


public void run()


{


while(monitorFlag)


{


try


{


Thread.sleep(interval);


checkFile();


} catch (Exception e)


{


e.printStackTrace();


}


}


}


/**


* 检查文件是否更新


*/


private void checkFile()


{


Set fileNames = fileMap.keySet();


for (String fileName : fileNames)


{


// 如果被修改过则通知被观察者


if (isModifide(fileName,fileMap.get(fileName)))


{


setChanged();


notifyObservers(fileName);


}


}


}


/**


* 判断是被修改过


* @param fileName


* @param lastModifyTime


* @return


*/


private boolean isModifide(String fileName,Long lastModifyTime)


{


File file = new File(fileName);


if (file ==null)


{


return false;


}


long time = lastModifyTime;


long lastTime = file.lastModified();


if (lastTime != time)


{


// 然后将文件map放置最新的时间


fileMap.put(fileName, lastTime);


return true;


}


return false;


}


/**


* 新增文件


* @param fileName


*/


public void addFile(String fileName)


{


// 如果文件为空则直接返回


if (StringUtils.isEmpty(fileName))


{


return;


}


Long lastModifyTime = getLastModifyTime(fileName);


fileMap.put(fileName, lastModifyTime);


}


/**


* 得到文件的最后修改时间


* @param fileName


* @return


*/


private Long getLastModifyTime(String fileName)


{


File file = new File(fileName);


if (null == file)


{


return 0L;


}


return file.lastModified();


}


}


package study.filemoniter;


import java.util.Observable;


import java.util.Observer;


/**


* 文件观察者


* @author dWX207527


*


*/


public class FileObserver implements Observer


{


@Override


public void update(Observable o, Object arg)


{


if (!(o instanceof FileMoniter) || !(arg instanceof String))


{


return ;


}


System.out.println("文件有改动");


// 一旦有改动则通知了观察者 观察者进行重新配置文件


String fileName = (String)arg;


FileMap.getInstance().fillFileMap(fileName);


}


}


package study.filemoniter;


import java.io.File;


import java.io.FileInputStream;


import java.io.InputStream;


import java.util.HashMap;


import java.util.Map;


import java.util.Properties;


/**


* 文件的容器


* @author dWX207527


*


*/


public class FileMap


{


private Map map = new HashMap();


private static FileMap fileMap = new FileMap();


private FileMap()


{


}


public static FileMap getInstance()


{


return fileMap;


}


public void fillFileMap(String fileName)


{


File file = new File(fileName);


InputStream inStream = null;


try {


inStream = new FileInputStream(file);


if (null == file)


{


return ;


}


Properties properties = new Properties();


properties.load(inStream);


String value = properties.getProperty("name");


map.put("name", value);


}


catch (Exception e) {


e.printStackTrace();


return ;


}


}


public Map getFileMap ()


{


return map;


}


}

相关推荐

最新更新

猜你喜欢