您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)java怎么實(shí)時動態(tài)獲取properties文件的內(nèi)容的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
用“ClassLoader.getResourceAsStream”讀取properties文件時會發(fā)現(xiàn)修改了.properties后,即使重新執(zhí)行,讀入的仍為修改前的參數(shù)。
此問題的原因在于ClassLoader.getResourceAsStream讀入后,會將.properties保存在緩存中,重新執(zhí)行時會從緩存中讀取,而不是再次讀取.properties文件。
import java.util.Properties; /** * 實(shí)時動態(tài)獲取properties文件的值 * @author Administrator * */ public class demo01 { /** * 根據(jù)配置變量實(shí)時獲取配置文件中的值 * @param key 配置名 * @param filePath 配置文件路徑名,例如:test.properties * @return 配置值 */ public static String getCurrentPropertiesValue(String key,String filePath){ String value=""; Properties p = new Properties(); try { //非實(shí)時動態(tài)獲取 //p.load(new InputStreamReader(this.class.getClassLoader().getResourceAsStream(filePath), "UTF-8")); //下面為動態(tài)獲取 String path = Thread.currentThread().getContextClassLoader().getResource("").getPath(); InputStream is = new FileInputStream(path +File.separator+ filePath); p.load(is); value=p.getProperty(key); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return value; } }
在java開發(fā)中, 對于一些常用的配置性的信息, 通常會采用存放在屬性文件中, 因?yàn)樾薷呐渲梦募o須重新編譯jar包. 對于屬性文件,通??梢允褂肞roperties和ResourceBundle 兩個類來解析. 需要注意的是, 默認(rèn)情況下java工程中的*.properties文件編碼格式是ISO-8859-1, Properties和ResourceBundle也是按照ISO-8859-1格式來解析屬性文件中字符串的. 所以對于解析包含中文的熟悉文件時,需要額外注意.
ResourceBundle: 通常用于解析國際化資源屬性文件, 會根據(jù)本地環(huán)境自動選擇對應(yīng)的國際化資源.
Properties: 用來解析普通屬性文件
1.1 Properties 常用API
Properties 繼承Hashtable<Object,Object>類.
方法簽名 | 方法描述 |
---|---|
public String getProperty(String key | 獲取屬性文件中的Key, 如果key不存在返回Null |
public String getProperty(String key, String defaultValue) | 獲取屬性文件中key對象的value, 如果key不存在則返回默認(rèn)值defaultValue |
public Object get(String key) | 父類HashTable中的方法, 返回值類型為Object |
1.2 ResourceBundle 常用API
ResourceBundle 是一個接口, 默認(rèn)使用PropertyResourceBundle來解析屬性文件.
方法簽名 | 方法描述 |
---|---|
public Locale getLocale() | 獲取本地國際化環(huán)境 |
public Enumeration getKeys() | 獲取屬性文件中所有key |
public final String getString(String key) | 獲取屬性文件中key對應(yīng)的value, 返回值為String, 如果不存在, 則拋出異常 |
public final Object getObject(String key) | 獲取屬性文件中key對應(yīng)的value, 返回值為Object, 如果不存在, 則拋出異常 |
默認(rèn)使用ISO-8859-1 解析配置文件中的字符串, 所以會導(dǎo)致中文亂碼.
2.1 解析純英文配置文件
// 默認(rèn)編碼(ISO-8859-1)讀取屬性文件, 中文亂碼 @Test public void test_properties_en() throws IOException{ // 屬性文件位置, 相對路徑為src/main/resources 或 src/test/resources, 不能添加classpath:/前綴 String propertyFileName = "jdbc.properties"; // 獲取字節(jié)流 InputStream is = getClass().getClassLoader().getResourceAsStream(propertyFileName); // 創(chuàng)建屬性文件, 并加載文件內(nèi)容 Properties properties = new Properties(); properties.load(is); String username = properties.getProperty("jdbc.username"); String password = properties.getProperty("jdbc.password"); System.out.println("username:" + username + ", password:" + password); }
2.2 解析含中文配置文件
默認(rèn)使用ISO-8859-1, 采用InputStreamReader轉(zhuǎn)換為UTF8字符流.
// 指定讀取文件編碼方式,支持讀取中文 @Test public void test_properties_zh() throws IOException{ // 屬性文件位置, 相對路徑為src/main/resources 或 src/test/resources, 不能添加classpath:/前綴 String propertyFileName = "jdbc.properties"; // 獲取字節(jié)流 InputStream is = getClass().getClassLoader().getResourceAsStream(propertyFileName); // 轉(zhuǎn)換為UTF-8格式字符流 InputStreamReader isr = new InputStreamReader(is, "UTF-8"); // 創(chuàng)建屬性文件, 并加載文件內(nèi)容 Properties properties = new Properties(); properties.load(isr); String username = properties.getProperty("jdbc.username"); String password = properties.getProperty("jdbc.password"); System.out.println("username:" + username + ", password:" + password); }
3.1 解析純英文配置文件
@Test public void testRb_en() { // 資源配置文件,無須寫文件后綴名, 默認(rèn)尋找properties文件 String bundleName = "jdbc"; // 設(shè)置本地默認(rèn)環(huán)境為英文環(huán)境 Locale.setDefault(Locale.ENGLISH); // 指定加載 ResourceBundle rb = ResourceBundle.getBundle(bundleName); String username = rb.getString("jdbc.username"); String password = rb.getString("jdbc.password"); System.out.println("username:" + username + ", password:" + password); }
3.2 解析含中文配置文件
// 處理中文 @Test public void testRb_zh() { // 資源配置文件,無須寫文件后綴名, 默認(rèn)尋找properties文件 String bundleName = "jdbc"; // 根據(jù)本地默認(rèn)環(huán)境加載資源配置文件 ResourceBundle rb = ResourceBundle.getBundle(bundleName); String username = iso2Utf8(rb.getString("jdbc.username")); String password = iso2Utf8(rb.getString("jdbc.password")); System.out.println("username:" + username + ", password:" + password); } /** * @Description iso編碼格式字符串轉(zhuǎn)換為UTF8格式 * @param str iso 編碼字符串 * @return * @author zongf * @date 2019年1月8日-下午3:55:29 */ private String iso2Utf8(String str) { if(null == str) return null; try { return new String(str.getBytes("ISO-8859-1"), "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; }
筆者創(chuàng)建的是maven 工程, 使用的是junit 單元測試, 所以筆者的配置文件存放在 src/test/resources 目錄下.
jdbc.properties
jdbc.username=張三 jdbc.password=123456
jdbc_zh.properties
jdbc.username=張三 jdbc.password=123456
jdbc_en.properties
jdbc.username=zhangsan jdbc.password=123456
筆者認(rèn)為, 一個設(shè)計良好的屬性配置類應(yīng)該是一個常量類, 至少需要符合兩個設(shè)計原則:
屬性一旦設(shè)置不可動態(tài)修改, 即使在編譯環(huán)境也不能調(diào)用修改方法.
能夠直接通過類屬性進(jìn)行訪問, 無須通過類對象訪問
自動裝配屬性, 而無須手動解析熟悉文件(spring中可借助自帶注解或自定義注解實(shí)現(xiàn))
public class JdbcProperty { /** 用戶名 */ public static final String username; /** 用戶密碼 */ public static final String password; // 在Spring應(yīng)用中,可借助注解或自定義注解進(jìn)行自動裝配,筆者此處只針對一般java應(yīng)用 static { // 加載屬性文件 ResourceBundle resourceBundle = ResourceBundle.getBundle("jdbc"); // 初始化屬性 username = resourceBundle.getString("jdbc.username"); password = resourceBundle.getString("jdbc.password"); } }
感謝各位的閱讀!關(guān)于“java怎么實(shí)時動態(tài)獲取properties文件的內(nèi)容”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。