单实例自动读取被修改的配置文件

    这是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;

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值