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

原创
2010/07/20 15:33
阅读数 384

常常有很多情况会对文件内容变化,需要清除缓存的内容,重新读取文件内容。下面的例子就是实现这样的功能

1.首先定义一个接口,会有很多类实现这个接口(遵循方法的参数尽量使用接口)

接口定义:FileChangeListener

public interface FileChangeListener
{
 /**
  *当文件发生改变时被调用
  *
  * @param 文件名
  */
 public void fileChanged(String filename);
}

2.实现类的定义


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

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

//清除缓存,reload

.......

 

        }
}

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

展开阅读全文
打赏
0
2 收藏
分享
加载中
更多评论
打赏
0 评论
2 收藏
0
分享
返回顶部
顶部