package com.newer;
import java.io.File;
import java.io.FileInputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;
/**
* 动态读取properties文件类
* @author RSun
* @Date 2012-11-14下午03:18:17
*/
public final class ReadPropertiesFile {
/** 属性文件全名,需要的时候请重新配置PFILE **/
private static String PFILE = "test.properties"; // src下面的文件
/** 属性文件所对应的属性对象变量 **/
private long m_lastModifiedTime = 0;
/** 对应于属性文件的文件对象变量 **/
private File m_file = null;
/** 属性文件所对应的属性对象变量 **/
private Properties m_props = null;
/** 唯一实例 **/
private static ReadPropertiesFile m_instance = new ReadPropertiesFile();
/** 私有构造函数 **/
private ReadPropertiesFile() {
try {
m_lastModifiedTime = getFile().lastModified();
if (m_lastModifiedTime == 0) {
System.err.println(PFILE + "file does not exist!");
}
m_props = new Properties();
m_props.load(new FileInputStream(getFile()));
} catch (URISyntaxException e) {
System.err.println(PFILE + "文件路径不正确");
e.printStackTrace();
} catch (Exception e) {
System.err.println(PFILE + "文件读取异常");
e.printStackTrace();
}
}
/**
* 查找ClassPath路径获取文件
* @return File对象
* @throws URISyntaxException
*/
private File getFile() throws URISyntaxException {
URI fileUri = this.getClass().getClassLoader().getResource(PFILE).toURI();
m_file = new File(fileUri);
return m_file;
}
/**
* 静态工厂方法
* @return 返回ConfigurationRead的单一实例
*/
public synchronized static ReadPropertiesFile getInstance() {
return m_instance;
}
/**
* 读取一特定的属性项
* @param name
属性项的名称
* @param defaultVal 读取失败默认值
* @return
*/
public String getConfigItem(String name, String defaultVal) {
long newTime = m_file.lastModified();
// 检查属性文件是否被修改
if (newTime == 0) {
// 属性文件不存在
if (m_lastModifiedTime == 0) {
System.err.println(PFILE + " file does not exist!");
} else {
System.err.println(PFILE + " file was deleted!!");
}
return defaultVal;
} else if (newTime > m_lastModifiedTime) {
m_props.clear();
try {
m_props.load(new FileInputStream(getFile()));
} catch (Exception e) {
System.err.println("文件重新读取异常");
e.printStackTrace();
}
}
m_lastModifiedTime = newTime;
String val = m_props.getProperty(name);
if (val == null) {
return defaultVal;
} else {
return val;
}
}
/**
* 读取一特定的属性项
* @param name 属性项的项名
* @return 属性项的值(如此项存在), 空(如此项不存在)
*/
public String getConfigItem(String name) {
return getConfigItem(name, "");
}
/**
* 读取一特定的属性项
* @param name 属性项的名称
* @return
截取空格后的数值
*/
public String getConfigItemTrim(String name) {
return getConfigItem(name, "").trim();
}
// 测试
public static void main(String[] args) {
System.out.println(ReadPropertiesFile.getInstance().getConfigItemTrim("aaa"));
System.out.println(ReadPropertiesFile.getInstance().getConfigItemTrim("bbb"));
System.out.println(ReadPropertiesFile.getInstance().getConfigItem("ccc", "哈哈,你被忽悠了!"));
}
}