如何用ResourceBundle來讀取配置文件

對於java基礎很好的人來說,這個應該是簡單的不能再簡單的了。不過估計一些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();
 }
}

關於ResourceBundle更詳細的信息,可以參考以下鏈接:
http://ja va.sun.com/docs/books/tutorial/i18n/resbundle/index.html (English)
http://www.leftworld.net/online/j2sedoc/ja varef/ja va.util.resourcebundle_dsc.htm (中文)


from:http://blog.csdn.net/haiyan0106/archive/2008/04/07/2257725.aspx

發佈了16 篇原創文章 · 獲贊 44 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章