import java.io.FileNotFoundException; import java.io.IOException; import java.util.Hashtable; import java.util.Properties; import org.apache.log4j.Logger; public class PropertyEditor { private static Logger _log = Logger.getLogger(PropertyEditor.class); private static Hashtable<String, Properties> pptContainer = new Hashtable<String, Properties>(); /** * * 方法用途和描述: 获得属性 * * @param propertyFilePath 属性文件(包括类路径) * @param key 属性键 * @return 属性值 * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ public final static String getValue(String propertyFilePath, String key) { Properties ppts = getProperties(propertyFilePath); return ppts == null ? null : ppts.getProperty(key); } /** * * 方法用途和描述: 获得属性文件中Key所对应的值 * * @param propertyFilePath 属性文件路径(包括类路径或文件系统中文件路径) * @param key 属性的键 * @param isAbsolutePath 是否为绝对路径:true|false〔即是本地文件系统路径,比如:C:/test.propreties〕 注:不能通过类路径来获取到属性文件,而只知道属性文件的文件系统路径,即文件系统地址则用此方法来获取其中的Key所对应的Value * @return key的属性值 * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ public final static String getValue(String propertyFilePath, String key, boolean isAbsolutePath) { if (isAbsolutePath) { Properties ppts = getPropertiesByFs(propertyFilePath); return ppts == null ? null : ppts.getProperty(key); } return getValue(propertyFilePath, key); } /** * * 方法用途和描述: 获得属性文件的属性 * * @param propertyFilePath 属性文件(包括类路径) * @return 属性 * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ public final static Properties getProperties(String propertyFilePath) { if (propertyFilePath == null) { _log.error("propertyFilePath is null!"); return null; } Properties ppts = pptContainer.get(propertyFilePath); if (ppts == null) { ppts = loadPropertyFile(propertyFilePath); if (ppts != null) { pptContainer.put(propertyFilePath, ppts); } } return ppts; } /** * * 方法用途和描述: 获得属性文件的属性 * * @param propertyFilePath 属性文件路径(包括类路径及文件系统路径) * @return 属性文件对象 Properties * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ public final static Properties getPropertiesByFs(String propertyFilePath) { if (propertyFilePath == null) { _log.error("propertyFilePath is null!"); return null; } Properties ppts = pptContainer.get(propertyFilePath); if (ppts == null) { ppts = loadPropertyFileByFileSystem(propertyFilePath); if (ppts != null) { pptContainer.put(propertyFilePath, ppts); } } return ppts; } /** * * 方法用途和描述: 加载属性 * * @param propertyFilePath 属性文件(包括类路径) * @return 属性 * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ private static Properties loadPropertyFile(String propertyFilePath) { java.io.InputStream is = PropertyEditor.class.getResourceAsStream(propertyFilePath); if (is == null) { return loadPropertyFileByFileSystem(propertyFilePath); } Properties ppts = new Properties(); try { ppts.load(is); return ppts; } catch (Exception e) { _log.debug("加载属性文件出错:" + propertyFilePath, e); return null; } } /** * * 方法用途和描述: 从文件系统加载属性文件 * * @param propertyFilePath 属性文件(文件系统的文件路径) * @return 属性 * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ private static Properties loadPropertyFileByFileSystem( final String propertyFilePath) { try { Properties ppts = new Properties(); ppts.load(new java.io.FileInputStream(propertyFilePath)); return ppts; } catch (java.io.FileNotFoundException e) { _log.error("FileInputStream(\"" + propertyFilePath + "\")! FileNotFoundException: " + e); return null; } catch (java.io.IOException e) { _log.error("Properties.load(InputStream)! IOException: " + e); return null; } } /** * * 方法用途和描述: 对存在的属性文件中添加键值对并保存 * * @param propertyFilePath 属性文件的路径(包括类路径及文件系统路径) * @param htKeyValue 键值对Hashtable * @return * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ public final static boolean setValueAndStore(String propertyFilePath, java.util.Hashtable<String, String> htKeyValue) { return setValueAndStore(propertyFilePath, htKeyValue, null); } /** * * 方法用途和描述: 对存在的属性文件中添加键值对并保存 * * @param propertyFilePath 属性文件的路径(包括类路径及文件系统路径) * @param htKeyValue 键值对Hashtable * @param storeMsg 保存时添加的附加信息(注释) * @return * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ public final static boolean setValueAndStore(String propertyFilePath, java.util.Hashtable<String, String> htKeyValue, String storeMsg) { Properties ppts = getProperties(propertyFilePath); if (ppts == null || htKeyValue == null) { return false; } ppts.putAll(htKeyValue); java.io.OutputStream stream = null; try { stream = new java.io.FileOutputStream(propertyFilePath); } catch (FileNotFoundException e) { _log.debug("propertyFilePath = " + propertyFilePath); String path = PropertyEditor.class.getResource(propertyFilePath).getPath(); _log.debug("~~~~~~~~path~~~XXX~~~~~" + path); try { stream = new java.io.FileOutputStream(path); } catch (FileNotFoundException e1) { _log.error("FileNotFoundException! path=" + propertyFilePath); return false; } } if (stream == null) { return false; } try { ppts.store(stream, storeMsg != null ? storeMsg : "set value and store."); return true; } catch (java.io.IOException e) { e.printStackTrace(); return false; } finally { if (stream != null) { try { stream.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * * 方法用途和描述: 创建属性文件 * * @param propertyFilePath 要存储属性文件的路径 * @param htKeyValue 属性文件中的键值对Hashtable * @return * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ public final static boolean createPropertiesFile(String propertyFilePath, java.util.Hashtable<String, String> htKeyValue) { java.io.File file = new java.io.File(propertyFilePath); if (!file.exists()) { try { file.createNewFile(); } catch (java.io.IOException e) { e.printStackTrace(); } } return setValueAndStore(propertyFilePath, htKeyValue, "create properties file:" + file.getName()); } /** * * 方法用途和描述:设置属性值 * * @param propertyFilePath 属性文件(包括类路径) * @param key 属性键 * @param value 属性值 * @return * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ public final static boolean setValue(String propertyFilePath, String key, String value) { Properties ppts = getProperties(propertyFilePath); if (ppts == null) { return false; } ppts.put(key, value); return true; } /** * * 方法用途和描述: 保存属性文件对象 * * @param properties 属性文件对象 * @param propertyFilePath 要保存的路径 * @param msg 保存时添加的附加信息(注释) * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ public final static void store(Properties properties, String propertyFilePath, String msg) { try { java.io.OutputStream stream = new java.io.FileOutputStream(propertyFilePath); properties.store(stream, msg); } catch (java.io.FileNotFoundException e) { _log.error("FileOutputStream(" + propertyFilePath + ")! FileNotFoundException: " + e); } catch (java.io.IOException e) { _log.error("store(stream, msg)! IOException: " + e); e.printStackTrace(); } } /** * * 方法用途和描述: 删除属性值 * * @param propertyFilePath * 属性文件(包括类路径) * @param key * 属性键 * @return * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ public final static String removeValue(String propertyFilePath, String key) { Properties ppts = getProperties(propertyFilePath); if (ppts == null) { return null; } return (String) ppts.remove(key); } /** * * 方法用途和描述: 删除属性文件中的Key数组所对应的键值对 * * @param propertyFilePath 属性文件路径(包括类路径及文件系统路径) * @param key 数组 * @return 属性文件对象 * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ public final static Properties removeValue(String propertyFilePath, String[] key) { if (key == null) { _log.error("key[] is null!"); return null; } Properties ppts = getProperties(propertyFilePath); if (ppts == null) { return null; } for (String strKey : key) { ppts.remove(strKey); } return ppts; } /** * * 方法用途和描述:删除属性文件中的Key数组所对应的键值对,并将属性文件对象持久化(即保存) * * @param propertyFilePath 属性文件路径(包括类路径及文件系统路径) * @param key 属性文件中的key数组 * @return 成功与否(true|false) * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ public final static boolean removeValueAndStore(String propertyFilePath, String[] key) { Properties ppts = removeValue(propertyFilePath, key); if (ppts == null) { return false; } store(ppts, propertyFilePath, "batch remove key value!"); return true; } /** * * 方法用途和描述: 更新指定路径的属性文件中的键所对应的值 * * @param propertyFilePath 属性文件路径(包括类路径及文件系统路径) * @param key 属性文件中的key * @param newValue 要更新的新值 * @return 成功与否(true|false) * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ public final static boolean updateValue(String propertyFilePath, String key, String newValue) { if (key == null || newValue == null) { _log.error("key or newValue is null!"); return false; } java.util.Hashtable<String, String> ht = new java.util.Hashtable<String, String>(); ht.put(key, newValue); return setValueAndStore(propertyFilePath, ht, "update " + key + "'s value!"); } /** * * 方法用途和描述: 批量更新指定路径的属性文件中的键所对应的值 * * @param propertyFilePath 属性文件路径(包括类路径及文件系统路径) * @param htKeyValue 要更新的键值对Hashtable * @return 成功与否(true|false) * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ public final static boolean batchUpdateValue(String propertyFilePath, java.util.Hashtable<String, String> htKeyValue) { if (propertyFilePath == null || htKeyValue == null) { return false; } return setValueAndStore(propertyFilePath, htKeyValue, "batch update key value!"); } /** * * 方法用途和描述: 移除加载的属性文件 * * @param propertyFilePath 属性文件(包括类路径) * @return * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ public final static Properties removePropertyFile(String propertyFilePath) { return pptContainer.remove(propertyFilePath); } /** * * 方法用途和描述: 重新加载某个Property文件 * * @param propertyFilePath 要重新加载的Property文件,如果当前内存中没有的话则加载,否则替换 * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ public final static void reloadPropertyFile(String propertyFilePath) { pptContainer.remove(propertyFilePath); loadPropertyFile(propertyFilePath); } /** * * 方法用途和描述: 获得属性文件的路径 * * @param pkg 包名 * @param propertyFileName 属性文件名 * @return * @author yushibo 新增日期:2010-11-16 * @author yushibo 修改日期:2010-11-16 * @since wapportal_manager version(2.0) */ public final static String getPpropertyFilePath(String pkg, String propertyFileName) { pkg = pkg == null ? "" : pkg.replaceAll("\\.", "/"); propertyFileName = propertyFileName.endsWith(".properties") ? propertyFileName : (propertyFileName + ".properties"); return "/" + pkg + "/" + propertyFileName; } public static void main(String[] args) { String path = "/dbRangeMap.properties"; String value = PropertyEditor.getValue(path, "jdbc.ip"); System.out.println("value = " + value); // _log.info("value = " + value); // Hashtable</string><string , String> ht = new Hashtable</string><string , String>(); // ht.put("name", "dengcd"); // PropertyReader.setValueAndStore(path, ht); // String v_ = PropertyReader.getValue(path, "name"); // _log.info("value1 = " + v_); // PropertyReader.reloadPropertyFile(path); // String v2_ = PropertyReader.getValue(path, "name"); // _log.info("value2 = " + v2_); } }