對於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