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

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

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值