文件修改自動從新加載內容技術實現

經常有不少狀況會對文件內容變化,須要清除緩存的內容,從新讀取文件內容。下面的例子就是實現這樣的功能java

1.首先定義一個接口,會有不少類實現這個接口(遵循方法的參數儘可能使用接口)緩存

接口定義:FileChangeListenerthis

public interface FileChangeListener
{
 /**
  *當文件發生改變時被調用
  *
  * @param 文件名
  */
 public void fileChanged(String filename);
}接口

2.實現類的定義rem


public class SystemGlobalsListener implements FileChangeListener
{
 private static final Logger logger = Logger.getLogger(SystemGlobalsListener.class);
 
 /**
  * @see FileChangeListener#fileChanged(java.lang.String)
  */
 public void fileChanged(String filename)
 {
        logger.info("Reloading "+ filename);get

        SystemGlobals.initGlobals(SystemGlobals.getApplicationPath(),
            SystemGlobals.getValue(ConfigKeys.DEFAULT_CONFIG));it

//清除緩存,reloadio

.......ast

 

        }
}class

3.文件管理者定義fileMonitor,由於管理者角色只並且只須要一個,否者亂套了,因此使用了單例模式。

同時使用了靜態內部類,做用是生成定時任務,每個文件對應一個定時任務,這些任務以文件名爲key,task爲value存放於map中。

文件修改是否修改過的標準就是文件最後修改時間的不一樣。若是不一樣立刻通知listener

public class FileMonitor{ private static Logger logger = Logger.getLogger(FileMonitor.class); private static final FileMonitor instance = new FileMonitor(); private Timer timer; private Map timerEntries;  private FileMonitor() {  this.timerEntries = new HashMap();  this.timer = new Timer(true); }  public static FileMonitor getInstance() {  return instance; }  /**  * 增長一個文件到monitor  *   * @param listener The file listener  * @param filename The filename to watch  * @param period The watch interval.  */ public void addFileChangeListener(FileChangeListener listener,   String filename, long period) {  this.removeFileChangeListener(filename);    logger.info("Watching " + filename);    FileMonitorTask task = new FileMonitorTask(listener, filename);    this.timerEntries.put(filename, task);  this.timer.schedule(task, period, period); }  /**  * Stop watching a file  *   * @param listener The file listener  * @param filename The filename to keep watch  */ public void removeFileChangeListener(String filename) {  FileMonitorTask task = (FileMonitorTask)this.timerEntries.remove(filename);    if (task != null) {   task.cancel();  } }  private static class FileMonitorTask extends TimerTask {  private FileChangeListener listener;  private String filename;  private File monitoredFile;  private long lastModified;    public FileMonitorTask(FileChangeListener listener, String filename) {   this.listener = listener;   this.filename = filename;      this.monitoredFile = new File(filename);   if (!this.monitoredFile.exists()) {    return;   }      this.lastModified = this.monitoredFile.lastModified();  }    public void run() {   long latestChange = this.monitoredFile.lastModified();   if (this.lastModified != latestChange) {    this.lastModified = latestChange;        this.listener.fileChanged(this.filename);   }  } }}

相關文章
相關標籤/搜索