文件修改自动从新加载内容技术实现

经常有不少状况会对文件内容变化,须要清除缓存的内容,从新读取文件内容。下面的例子就是实现这样的功能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);   }  } }}

相关文章
相关标签/搜索