亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java怎么實時動態獲取properties文件的內容

發布時間:2021-09-14 15:37:39 來源:億速云 閱讀:249 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關java怎么實時動態獲取properties文件的內容的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

java 實時動態獲取properties文件的內容

用“ClassLoader.getResourceAsStream”讀取properties文件時會發現修改了.properties后,即使重新執行,讀入的仍為修改前的參數。

此問題的原因在于ClassLoader.getResourceAsStream讀入后,會將.properties保存在緩存中,重新執行時會從緩存中讀取,而不是再次讀取.properties文件。

動態讀取的代碼

import java.util.Properties; 
/**
 * 實時動態獲取properties文件的值
 * @author Administrator
 *
 */
public class demo01 {
 /**
  * 根據配置變量實時獲取配置文件中的值
  * @param key 配置名
  * @param filePath 配置文件路徑名,例如:test.properties
  * @return 配置值
  */
 public static String getCurrentPropertiesValue(String key,String filePath){
  String value="";
  Properties p = new Properties();
  try {
   //非實時動態獲取
   //p.load(new InputStreamReader(this.class.getClassLoader().getResourceAsStream(filePath), "UTF-8"));
   //下面為動態獲取
   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 讀取配置文件 Properties VS ResourceBundle

在java開發中, 對于一些常用的配置性的信息, 通常會采用存放在屬性文件中, 因為修改配置文件無須重新編譯jar包. 對于屬性文件,通常可以使用Properties和ResourceBundle 兩個類來解析. 需要注意的是, 默認情況下java工程中的*.properties文件編碼格式是ISO-8859-1, Properties和ResourceBundle也是按照ISO-8859-1格式來解析屬性文件中字符串的. 所以對于解析包含中文的熟悉文件時,需要額外注意.

  • ResourceBundle: 通常用于解析國際化資源屬性文件, 會根據本地環境自動選擇對應的國際化資源.

  • Properties: 用來解析普通屬性文件

1. 常用API

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不存在則返回默認值defaultValue
public Object get(String key)父類HashTable中的方法, 返回值類型為Object

1.2 ResourceBundle 常用API

ResourceBundle 是一個接口, 默認使用PropertyResourceBundle來解析屬性文件.

方法簽名方法描述
public Locale getLocale()獲取本地國際化環境
public Enumeration getKeys()獲取屬性文件中所有key
public final String getString(String key)獲取屬性文件中key對應的value, 返回值為String, 如果不存在, 則拋出異常
public final Object getObject(String key)獲取屬性文件中key對應的value, 返回值為Object, 如果不存在, 則拋出異常

2. Properties 解析屬性文件

默認使用ISO-8859-1 解析配置文件中的字符串, 所以會導致中文亂碼.

2.1 解析純英文配置文件

// 默認編碼(ISO-8859-1)讀取屬性文件, 中文亂碼
@Test
public void test_properties_en() throws IOException{
 
 // 屬性文件位置, 相對路徑為src/main/resources 或 src/test/resources, 不能添加classpath:/前綴
 String propertyFileName = "jdbc.properties";
 
 // 獲取字節流
 InputStream is = getClass().getClassLoader().getResourceAsStream(propertyFileName);
 
 // 創建屬性文件, 并加載文件內容
 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 解析含中文配置文件

默認使用ISO-8859-1, 采用InputStreamReader轉換為UTF8字符流.

// 指定讀取文件編碼方式,支持讀取中文
@Test
public void test_properties_zh() throws IOException{
 
 // 屬性文件位置, 相對路徑為src/main/resources 或 src/test/resources, 不能添加classpath:/前綴
 String propertyFileName = "jdbc.properties";
 
 // 獲取字節流
 InputStream is = getClass().getClassLoader().getResourceAsStream(propertyFileName);
 
 // 轉換為UTF-8格式字符流
 InputStreamReader isr = new InputStreamReader(is, "UTF-8");
 
 // 創建屬性文件, 并加載文件內容
 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. ResourceBundle 解析屬性文件

3.1 解析純英文配置文件

@Test
public void testRb_en() {
 // 資源配置文件,無須寫文件后綴名, 默認尋找properties文件
 String bundleName = "jdbc";
 
 // 設置本地默認環境為英文環境
 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() {
 // 資源配置文件,無須寫文件后綴名, 默認尋找properties文件
 String bundleName = "jdbc";
 
 // 根據本地默認環境加載資源配置文件
 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編碼格式字符串轉換為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;
}

4. 屬性文件

筆者創建的是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

5. 實戰推薦

筆者認為, 一個設計良好的屬性配置類應該是一個常量類, 至少需要符合兩個設計原則:

屬性一旦設置不可動態修改, 即使在編譯環境也不能調用修改方法.

能夠直接通過類屬性進行訪問, 無須通過類對象訪問

自動裝配屬性, 而無須手動解析熟悉文件(spring中可借助自帶注解或自定義注解實現)

public class JdbcProperty { 
 /** 用戶名 */
 public static final String username;
 
 /** 用戶密碼 */
 public static final String password;
 
 // 在Spring應用中,可借助注解或自定義注解進行自動裝配,筆者此處只針對一般java應用
 static {
  
  // 加載屬性文件
  ResourceBundle resourceBundle = ResourceBundle.getBundle("jdbc");
  
  // 初始化屬性
  username = resourceBundle.getString("jdbc.username");
  password = resourceBundle.getString("jdbc.password");  
 }
}

感謝各位的閱讀!關于“java怎么實時動態獲取properties文件的內容”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

镇坪县| 黎城县| 荥阳市| 德化县| 汉阴县| 东台市| 昌都县| 太保市| 资溪县| 博爱县| 龙山县| 咸宁市| 中山市| 栖霞市| 乌拉特前旗| 巴林左旗| 宝坻区| 涿州市| 金秀| 望谟县| 铜山县| 涿鹿县| 惠来县| 平定县| 余庆县| 南平市| 盐池县| 朝阳市| 叶城县| 柳河县| 焦作市| 浦北县| 镇巴县| 大城县| 丹东市| 公安县| 美姑县| 佛坪县| 拉孜县| 岫岩| 堆龙德庆县|