激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java如何實時動態(tài)獲取properties文件的內(nèi)容

java如何實時動態(tài)獲取properties文件的內(nèi)容

2021-12-31 10:59小元子子 Java教程

這篇文章主要介紹了java如何實時動態(tài)獲取properties文件的內(nèi)容,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

實時動態(tài)獲取properties文件的內(nèi)容

用“ClassLoader.getResourceAsStream”讀取properties文件時會發(fā)現(xiàn)修改了.properties后,即使重新執(zhí)行,讀入的仍為修改前的參數(shù)。

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

動態(tài)讀取的代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.Properties;
/**
 * 實時動態(tài)獲取properties文件的值
 * @author Administrator
 *
 */
public class demo01 {
 /**
  * 根據(jù)配置變量實時獲取配置文件中的值
  * @param key 配置名
  * @param filePath 配置文件路徑名,例如:test.properties
  * @return 配置值
  */
 public static String getCurrentPropertiesValue(String key,String filePath){
  String value="";
  Properties p = new Properties();
  try {
   //非實時動態(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;
 }
}

讀取配置文件 Properties VS ResourceBundle

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

  • ResourceBundle: 通常用于解析國際化資源屬性文件, 會根據(jù)本地環(huán)境自動選擇對應的國際化資源.
  • 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() 獲取本地國際化環(huán)境
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 解析純英文配置文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 默認編碼(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 解析含中文配置文件

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 指定讀取文件編碼方式,支持讀取中文
@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);
 
 // 轉換為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. ResourceBundle 解析屬性文件

3.1 解析純英文配置文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Test
public void testRb_en() {
 // 資源配置文件,無須寫文件后綴名, 默認尋找properties文件
 String bundleName = "jdbc";
 
 // 設置本地默認環(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 解析含中文配置文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 處理中文
@Test
public void testRb_zh() {
 // 資源配置文件,無須寫文件后綴名, 默認尋找properties文件
 String bundleName = "jdbc";
 
 // 根據(jù)本地默認環(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編碼格式字符串轉換為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. 屬性文件

筆者創(chuàng)建的是maven 工程, 使用的是junit 單元測試, 所以筆者的配置文件存放在 src/test/resources 目錄下.

jdbc.properties

?
1
2
jdbc.username=張三
jdbc.password=123456

jdbc_zh.properties

?
1
2
jdbc.username=張三
jdbc.password=123456

jdbc_en.properties

?
1
2
jdbc.username=zhangsan
jdbc.password=123456

5. 實戰(zhàn)推薦

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

屬性一旦設置不可動態(tài)修改, 即使在編譯環(huán)境也不能調用修改方法.

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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"); 
 }
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/OliverQY/article/details/80912058

延伸 · 閱讀

精彩推薦
  • Java教程Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
主站蜘蛛池模板: 精品免费久久 | 国产精品视频一区二区三区四区五区 | 色播视频在线播放 | 国产女做a爱免费视频 | 叶子楣成人爽a毛片免费啪啪 | 国产乱淫a∨片免费视频 | 久久综合福利 | 久久精品99久久久久久2456 | 史上最强炼体老祖动漫在线观看 | 中文字幕伦乱 | 99在线精品视频免费观看20 | 中文字幕国产欧美 | 久久精品视频16 | 欧美一区二区网站 | 亚洲国产精品二区 | 一区二区三区四区在线 | 欧美黄色一级片在线观看 | 久久久久一区二区三区四区五区 | 久久国产秒 | 免费播放欧美毛片 | 久久影院一区二区三区 | 久久精品伊人网 | 欧美一区二区三区免费观看 | 国产亚洲在 | 草逼一区| 色av成人天堂桃色av | 日本精品久久久久 | 国产一级免费电影 | 成人午夜视频免费在线观看 | 成人三级黄色片 | 中文字幕国产一区 | 久久观看免费视频 | 一区二区三区日韩 | 天天操天天看 | 毛片免费一区二区三区 | 中文字幕视频在线播放 | 欧美xxxwww| 妇子乱av一区二区三区 | 一区小视频 | 国产盼盼私拍福利视频99 | 国产一级小视频 |