Java語言對properties資源檔的處理 – ResourceBundle類的用

來源:互聯網
上載者:User
Java語言提供了ResourceBundle類來對properties類型的資源檔加以處理。

本文對ResourceBundle類做一個解說。

開始之前,我們先解釋一下什麼是properties類型的資源檔。

在Java語言中,使用一種以.properties為副檔名的文字檔作為資源檔,該類型的檔案的內容格式為類似:

#備註陳述式
some_key=some_value

形式。以#開頭的行作為注釋行,ResourceBundle類處理時會加以忽略;其餘的行可以以 key名=value值 的形式加以記述。

Java的ResourceBundle類可以對這種形式的檔案加以處理。

ResourceBundle類的使用方法也非常簡單。我們使用一個例子來說明。

我們假設有下面2個properties檔案:
TestProperties.propertiesview plainprint?

  1. #key=value  
  2. userIdLabel=User Id:   
  3. userNameLabel=User Name:  
#key=valueuserIdLabel=User Id: userNameLabel=User Name:

TestProperties_zh_CN.propertiesview plainprint?

  1. #key=value  
  2. userIdLabel=使用者ID:   
  3. userNameLabel=使用者名稱:  
#key=valueuserIdLabel=使用者ID: userNameLabel=使用者名稱:

大家可能注意到TestProperties_zh_CN.properties檔案名稱中有一個_zh_CN
稱,該名稱其實是用於資源檔的本地化處理。什麼是本地化呢?我們簡單說明一下:我們在進行系統開發時,很多時候需要為不同地區的使用者準備不同的介面,比
如,如果一個系統同時面向 英語圈
的使用者以及面向中國的使用者,我們就必須為系統準備2套介面(包括訊息),一套為英語介面,一套為中文介面。當然,除了介面不同之外,系統的處理過程完全一
樣。當然我們不可能為它們分別開發2套不同的系統,怎麼辦呢?這就需要用到資源的本地化處理。也就是說,根據使用者所處的地區或語言的不同,分別準備不同的
資源檔,這樣就可以為不同的使用者準備不同的介面但使用的卻是同一套系統邏輯。

我們上面的2個檔案就是2套不同的資源。

我們是使用ResourceBundle類處理不同資源的代碼:

TestProperties.javaview plainprint?

  1. package com.test.properties;  
  2.   
  3. import java.util.Enumeration;  
  4. import java.util.Locale;  
  5. import java.util.ResourceBundle;  
  6.   
  7. public class TestProperties  {  
  8.           
  9.     public static void main(String []args) {  
  10.         String resourceFile = "com.test.properties.TestProperties";  
  11.         //建立一個預設的ResourceBundle對象  
  12.         //ResourceBundle會尋找包com.test.properties下的TestProperties.properties的檔案  
  13.         //com.test.properties是資源的包名,它跟普通java類的命名規則完全一樣:  
  14.         //- 區分大小寫  
  15.         //- 副檔名 .properties 省略。就像對於類可以省略掉 .class副檔名一樣  
  16.         //- 資源檔必須位於指定包的路徑之下(位於所指定的classpath中)  
  17.         //另外,對於非西歐字元(比如中日韓文等),需要使用native2ascii命令或類似工具將其轉換成ascii碼檔案格式,否則會顯示亂碼。  
  18.         System.out.println("---Default Locale---");  
  19.         ResourceBundle resource = ResourceBundle.getBundle(resourceFile);  
  20.           
  21.         testResourceBundle(resource);  
  22.   
  23.         System.out.println("---Locale.SIMPLIFIED_CHINESE---");  
  24.           
  25.         //建立一個指定Locale(本地化)的ResourceBundle對象,這裡指定為Locale.SIMPLIFIED_CHINESE  
  26.         //所以ResourceBundle會尋找com.test.properties.TestProperties_zh_CN.properties的檔案  
  27.         //  
  28.         //中文相關的Locale有:  
  29.         //Locale.SIMPLIFIED_CHINESE : zh_CN  
  30.         resource = ResourceBundle.getBundle(resourceFile, Locale.SIMPLIFIED_CHINESE);  
  31.         //Locale.CHINA  : zh_CN  
  32.         //Locale.CHINESE: zh  
  33.         testResourceBundle(resource);  
  34.           
  35.         //顯示  
  36.         //  
  37.     }  
  38.       
  39.     private static void testResourceBundle(ResourceBundle resource) {  
  40.         //取得指定關鍵字的value值  
  41.         String userIdLabel = resource.getString("userIdLabel");  
  42.         System.out.println(userIdLabel);  
  43.           
  44.         //取得所有key值  
  45.         Enumeration <String>enu = resource.getKeys();  
  46.           
  47.         System.out.println("keys:");  
  48.         while(enu.hasMoreElements()) {  
  49.             System.out.println(enu.nextElement());  
  50.         }  
  51.     }  
  52. }  
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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.