这是2008年在入职公司工作时解决问题是发表的文章,当时只是把代码贴上了,今天看到后觉得不太容易理解,所以决定加一段描述。
当时工作过程中遇到一个问题,在服务器启动的情况下,修改配置文件,是否能够立即生效,也就是热修改,不重启服务器。当时的思路是当配置文件被修改后,资源管理类能够重新读取配置文件。如何判断配置文件被修改呢,这是问题的核心。沿着这个思路查看相关文档,发现java.io.File类有lastModified()方法,标示文件最后被修改的时间,本文就是以此为契机进行实现。
资源管理类一般有单实例实现,所以才有文章的名字《单实例自动读取被修改的配置文件》。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
public class PropertiesReload {
//资源文件的路径
private String filePath="C://config.properties";
private long lastReadDate=0;
private File file=null;
private Properties pro=null;
private static int accessNum=0;
private PropertiesReload(){
file=new File(filePath);
pro=new Properties();
}
/**
* 初始化数据,加载资源文件
* 读取资源文件里的属性值
* */
private void init(){
System.out.println("accessNum:"+(++accessNum));
FileInputStream stream=null;
try {
stream=new FileInputStream(file);
pro.load(stream);
stream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//读取资源文件里的属性值
name=pro.getProperty("NAME");
}
/**
* 判断是不是需要重新读取资源文件
* */
private void isReload(){
long lastModifiedTime=getLastModifiedDate();
if(lastModifiedTime>lastReadDate){
init();
lastReadDate=lastModifiedTime;
}
}
/**
* 得到文件被修改的最后时间
* */
private long getLastModifiedDate(){
return file.lastModified();
}
/**
* 得到类的实例
* */
private static PropertiesReload instance=new PropertiesReload();
public static PropertiesReload getInstance(){
instance.isReload();
return instance;
}
/**
* 得到资源文件里的值
* */
private String name;
public String getName(){
return name;
}
}