如何用ResourceBundle來讀取配置文件

 對於ja va基礎很好的人來講,這個應該是簡單的不能再簡單的了。不過估計一些ja va新手不必定會知道(好比我,上次爲別人寫一個東西,須要從外存讀文件來設置對象的值,由於不知道有ResourceBundle這種東西,就本身用FileReader在那搞,折騰了半天,最後還不能把配置文件和jar包打在一塊兒發佈,鬱悶)。服務器

咱們能夠在每一個對象中用ResourceBundle來讀配置文件設置本身的值,也能夠用一個固定的對象去讀取而後保存下來以便之後使用。在每一個class中都去讀配置文件會致使代碼散亂,因此,只用一個class來進行讀取是比較合理的作法。另外,因爲I/O的速度比較慢,若是負責讀取配置文件的class是在每次用到這些配置項的時候去讀文件,就容易成爲性能上的瓶頸。爲避免這樣的狀況,能夠在初始化的時候就把配置項一次所有讀入,並保存在靜態成員變量中。不過不排除會有對配置項進行動態讀取的需求(由於某些應用是不能停掉的,好比應用服務器。在這些應用運行期間更新了配置文件,就須要在不不關閉應用的狀況下從新讀入配置項)。如下的例子只考慮了靜態讀取的狀況,若是是動態讀取,則能夠把讀取配置文件的代碼放到某個方法中,經過對某個事件的響應來調用該方法更新配置項。
假設咱們用來讀取配置文件的class叫TestResourceBundle,配置項的值來自一個叫property_en.properties的文件(該文件應該放到TestResourceBundle所對應的CLASSPATH的目錄),有兩個值須要配置:name和value。首先,須要在該class中定義一些字符串常量,以下:
public static final String PROPERTIES_FILE_NAME = "property";
public static final String MY_NAME_KEY = "name";
public static final String MY_VALUE_KEY = "value";
 
其中PROPERTIES_FILE_NAME指出了文件的名字。實際讀取的文件應該是property_en.properties,可是隻須要告訴ResourceBundle文件名是"property"就足夠了。下劃線和後面的"en"表示的是本地化信息。這裏的en表明"ENGLISH",後綴properties是默認的。MY_NAME_KEY和MY_VALUE_KEY表示配置項在配置文件中的名字,用ResourceBundle的getString方法根據這些名字去讀取相應的值。
而後,定義須要配置的變量。這些變量應該是靜態的:
private static String myName;
private static String myValue;
而後進行靜態初始化:
static {
 try {
   ResourceBundle bundle = ResourceBundle
     .getBundle(PROPERTIES_FILE_NAME, Locale.ENGLISH);
   myName = bundle.getString(MY_NAME_KEY).trim();
   myValue = bundle.getString(MY_VALUE_KEY).trim();
 }
 catch(Exception ex) {
   System.err.println(  "[Property]:Can't Load property.properties");
   myName = "default name";
   myValue = "default value";
   System.out.println(  "myName will use the default value: " + myName);
   System.out.println(  "myValue will use the default value: " + myValue);
 }
}
 ResourceBundle bundle = ResourceBundle
  .getBundle(PROPERTIES_FILE_NAME, Locale.ENGLISH);
這行代碼初始化了一個ResourceBundle,Locale.ENGLISH用於指明本地化狀況,所以會從"property_en.properties"中去讀取配置項。若是是Locale.CHINA,則會從property_zh.properties中讀取。這種機制使得程序的本地化變得簡單。
 myName = bundle.getString(MY_NAME_KEY).trim();
這行代碼讀入配置文件中名爲"name"的變量的值,並賦給靜態變量myName。
此外這段代碼還包含了例外處理,當讀取失敗的時候,配置項會使用缺省值。
這樣,該類就經過ResourceBundle讀取外存上的配置文件對數據進行了配置。
property_en.properties文件的內容以下
# properties sample
#
name=sega
value=100
其中以'#'開頭的行爲註釋,ResourceBundle在遇到這些行的時候會忽略掉。
如下爲完整的測試代碼:
public class TestResourceBundle {
 public static final String PROPERTIES_FILE_NAME = "property";
 public static final String MY_NAME_KEY = "name";
 public static final String MY_VALUE_KEY = "value";
 
 private static String myName;
 private static String myValue;
 static {
   try {
     ResourceBundle bundle = ResourceBundle
  .getBundle(PROPERTIES_FILE_NAME, Locale.ENGLISH);
     myName = bundle.getString(MY_NAME_KEY).trim();
     myValue = bundle.getString(MY_VALUE_KEY).trim();
   }
   catch(Exception ex) {
  System.err.println(    "[Property]:Can't Load property.properties");
  myName = "default name";
  myValue = "default value";
  System.out.println(    "myName will use the default value: " + myName);
  System.out.println(    "myValue will use the default value: " + myValue);
   }
 }
 
 public void print() {
  System.out.println("My name is: " + myName);
  System.out.println("My value is: " + myValue);
 }
 public static void main(String[] args) {
  TestResourceBundle test = new TestResourceBundle();
  test.print();
 }
}
相關文章
相關標籤/搜索