Java語言提供了ResourceBundle類來對properties類型的資源檔加以處理。
本文對ResourceBundle類做一個解說。
開始之前,我們先解釋一下什麼是properties類型的資源檔。
在Java語言中,使用一種以.properties為副檔名的文字檔作為資源檔,該類型的檔案的內容格式為類似:
#備註陳述式
some_key=some_value
形式。以#開頭的行作為注釋行,ResourceBundle類處理時會加以忽略;其餘的行可以以 key名=value值 的形式加以記述。
Java的ResourceBundle類可以對這種形式的檔案加以處理。
ResourceBundle類的使用方法也非常簡單。我們使用一個例子來說明。
我們假設有下面2個properties檔案:
TestProperties.propertiesview plainprint?
- #key=value
- userIdLabel=User Id:
- userNameLabel=User Name:
#key=valueuserIdLabel=User Id: userNameLabel=User Name:
TestProperties_zh_CN.propertiesview plainprint?
- #key=value
- userIdLabel=使用者ID:
- userNameLabel=使用者名稱:
#key=valueuserIdLabel=使用者ID: userNameLabel=使用者名稱:
大家可能注意到TestProperties_zh_CN.properties檔案名稱中有一個_zh_CN名
稱,該名稱其實是用於資源檔的本地化處理。什麼是本地化呢?我們簡單說明一下:我們在進行系統開發時,很多時候需要為不同地區的使用者準備不同的介面,比
如,如果一個系統同時面向 英語圈
的使用者以及面向中國的使用者,我們就必須為系統準備2套介面(包括訊息),一套為英語介面,一套為中文介面。當然,除了介面不同之外,系統的處理過程完全一
樣。當然我們不可能為它們分別開發2套不同的系統,怎麼辦呢?這就需要用到資源的本地化處理。也就是說,根據使用者所處的地區或語言的不同,分別準備不同的
資源檔,這樣就可以為不同的使用者準備不同的介面但使用的卻是同一套系統邏輯。
我們上面的2個檔案就是2套不同的資源。
我們是使用ResourceBundle類處理不同資源的代碼:
TestProperties.javaview plainprint?
- package com.test.properties;
-
- import java.util.Enumeration;
- import java.util.Locale;
- import java.util.ResourceBundle;
-
- public class TestProperties {
-
- public static void main(String []args) {
- String resourceFile = "com.test.properties.TestProperties";
- //建立一個預設的ResourceBundle對象
- //ResourceBundle會尋找包com.test.properties下的TestProperties.properties的檔案
- //com.test.properties是資源的包名,它跟普通java類的命名規則完全一樣:
- //- 區分大小寫
- //- 副檔名 .properties 省略。就像對於類可以省略掉 .class副檔名一樣
- //- 資源檔必須位於指定包的路徑之下(位於所指定的classpath中)
- //另外,對於非西歐字元(比如中日韓文等),需要使用native2ascii命令或類似工具將其轉換成ascii碼檔案格式,否則會顯示亂碼。
- System.out.println("---Default Locale---");
- ResourceBundle resource = ResourceBundle.getBundle(resourceFile);
-
- testResourceBundle(resource);
-
- System.out.println("---Locale.SIMPLIFIED_CHINESE---");
-
- //建立一個指定Locale(本地化)的ResourceBundle對象,這裡指定為Locale.SIMPLIFIED_CHINESE
- //所以ResourceBundle會尋找com.test.properties.TestProperties_zh_CN.properties的檔案
- //
- //中文相關的Locale有:
- //Locale.SIMPLIFIED_CHINESE : zh_CN
- resource = ResourceBundle.getBundle(resourceFile, Locale.SIMPLIFIED_CHINESE);
- //Locale.CHINA : zh_CN
- //Locale.CHINESE: zh
- testResourceBundle(resource);
-
- //顯示
- //
- }
-
- private static void testResourceBundle(ResourceBundle resource) {
- //取得指定關鍵字的value值
- String userIdLabel = resource.getString("userIdLabel");
- System.out.println(userIdLabel);
-
- //取得所有key值
- Enumeration <String>enu = resource.getKeys();
-
- System.out.println("keys:");
- while(enu.hasMoreElements()) {
- System.out.println(enu.nextElement());
- }
- }
- }
package com.test.properties;import java.util.Enumeration;import java.util.Locale;import java.util.ResourceBundle;public class TestProperties { public static void main(String []args) { String resourceFile = "com.test.properties.TestProperties"; //建立一個預設的ResourceBundle對象 //ResourceBundle會尋找包com.test.properties下的TestProperties.properties的檔案 //com.test.properties是資源的包名,它跟普通java類的命名規則完全一樣: //- 區分大小寫 //- 副檔名 .properties 省略。就像對於類可以省略掉 .class副檔名一樣 //- 資源檔必須位於指定包的路徑之下(位於所指定的classpath中) //另外,對於非西歐字元(比如中日韓文等),需要使用native2ascii命令或類似工具將其轉換成ascii碼檔案格式,否則會顯示亂碼。 System.out.println("---Default Locale---"); ResourceBundle resource = ResourceBundle.getBundle(resourceFile); testResourceBundle(resource); System.out.println("---Locale.SIMPLIFIED_CHINESE---"); //建立一個指定Locale(本地化)的ResourceBundle對象,這裡指定為Locale.SIMPLIFIED_CHINESE //所以ResourceBundle會尋找com.test.properties.TestProperties_zh_CN.properties的檔案 // //中文相關的Locale有: //Locale.SIMPLIFIED_CHINESE : zh_CN resource = ResourceBundle.getBundle(resourceFile, Locale.SIMPLIFIED_CHINESE); //Locale.CHINA : zh_CN //Locale.CHINESE: zh testResourceBundle(resource); //顯示 // } private static void testResourceBundle(ResourceBundle resource) { //取得指定關鍵字的value值 String userIdLabel = resource.getString("userIdLabel"); System.out.println(userIdLabel); //取得所有key值 Enumeration <String>enu = resource.getKeys(); System.out.println("keys:"); while(enu.hasMoreElements()) { System.out.println(enu.nextElement()); } }}
解說:
1,為了便於理解,我們把解說放在Java原始碼中了,這裡不再詳述了。
2,對於中文資源檔TestProperties_zh_CN.properties,需要使用native2ascii 命令將其轉換為ascii碼。例如:
native2ascii -encoding UTF-8 c:/TestProperties_zh_CN.properties c:/java/com/test/properties/TestProperties_zh_CN.properties
至於native2ascii的詳細用法這裡不做詳述了。
3,將上面3個檔案都儲存在 c:/java/com/test/properties/ 目錄下。其中TestProperties_zh_CN.properties為經過native2ascii轉換後的檔案。
4,編譯執行,將會在螢幕上顯示:c:/java/javac com.test.properties.TestProperties.java
c:/java/java com.test.properties.TestProperties
---Default Locale---
User Id:
keys:
userNameLabel
userIdLabel
---Locale.SIMPLIFIED_CHINESE---
使用者ID:
keys:
userNameLabel
userIdLabel