鴻蒙OS ResourceBundle

2022-08-04 14:34 更新

ResourceBundle

java.lang.Object

|---java.util.ResourceBundle

public abstract class ResourceBundle
extends Object

資源包包含特定于語(yǔ)言環(huán)境的對(duì)象。 當(dāng)您的程序需要特定于語(yǔ)言環(huán)境的資源(例如字符串)時(shí),您的程序可以從適合當(dāng)前用戶語(yǔ)言環(huán)境的資源包中加載它。 通過這種方式,您可以編寫在很大程度上獨(dú)立于用戶語(yǔ)言環(huán)境的程序代碼,從而將資源包中的大多數(shù)(如果不是全部)特定于語(yǔ)言環(huán)境的信息隔離開來。

這使您可以編寫能夠:

  • 易于本地化或翻譯成不同的語(yǔ)言
  • 一次處理多個(gè)語(yǔ)言環(huán)境
  • 稍后可以輕松修改以支持更多語(yǔ)言環(huán)境

資源包屬于其成員共享一個(gè)通用基本名稱的系列,但其名稱還具有標(biāo)識(shí)其語(yǔ)言環(huán)境的附加組件。 例如,資源包系列的基本名稱可能是“MyResources”。 該系列應(yīng)該有一個(gè)默認(rèn)資源包,它與它的系列具有相同的名稱 - “MyResources” - 如果不支持特定的語(yǔ)言環(huán)境,它將被用作最后的資源包。 然后,該家族可以根據(jù)需要提供盡可能多的特定于語(yǔ)言環(huán)境的成員,例如名為“MyResources_de”的德國(guó)成員。

一個(gè)系列中的每個(gè)資源包都包含相同的項(xiàng)目,但這些項(xiàng)目已針對(duì)該資源包所代表的語(yǔ)言環(huán)境進(jìn)行了翻譯。 例如,“MyResources”和“MyResources_de”都可能有一個(gè)用于取消操作的按鈕的字符串。 在“MyResources”中,字符串可能包含“Cancel”,而在“MyResources_de”中,它可能包含“Abbrechen”。

如果不同國(guó)家有不同的資源,您可以進(jìn)行專門化:例如,“MyResources_de_CH”包含瑞士 (CH) 的德語(yǔ) (de) 對(duì)象。 如果您只想修改專精中的部分資源,您可以這樣做。

當(dāng)您的程序需要特定于語(yǔ)言環(huán)境的對(duì)象時(shí),它會(huì)使用 getBundle 方法加載 ResourceBundle 類:

 ResourceBundle myResources =
      ResourceBundle.getBundle("MyResources", currentLocale);

資源包包含鍵/值對(duì)。 這些鍵唯一地標(biāo)識(shí)包中特定于語(yǔ)言環(huán)境的對(duì)象。 下面是一個(gè)包含兩個(gè)鍵/值對(duì)的 ListResourceBundle 示例:

 public class MyResources extends ListResourceBundle {
     protected Object[][] getContents() {
         return new Object[][] {
             // LOCALIZE THE SECOND STRING OF EACH ARRAY (e.g., "OK")
             {"OkKey", "OK"},
             {"CancelKey", "Cancel"},
             // END OF MATERIAL TO LOCALIZE
        };
     }
 }

鍵始終是字符串。 在本例中,鍵是“OkKey”和“CancelKey”。 在上面的例子中,值也是字符串——“OK”和“Cancel”——但它們不是必須的。 這些值可以是任何類型的對(duì)象。

您可以使用適當(dāng)?shù)?getter 方法從資源包中檢索對(duì)象。 因?yàn)?"OkKey" 和 "CancelKey" 都是字符串,所以您可以使用 getString 來檢索它們:

 button1 = new Button(myResources.getString("OkKey"));
 button2 = new Button(myResources.getString("CancelKey"));

getter 方法都需要鍵作為參數(shù),如果找到則返回對(duì)象。 如果找不到對(duì)象,getter 方法會(huì)拋出 MissingResourceException。

除了 getString,ResourceBundle 還提供了獲取字符串?dāng)?shù)組的方法 getStringArray,以及用于任何其他類型對(duì)象的通用 getObject 方法。 使用 getObject 時(shí),您必須將結(jié)果轉(zhuǎn)換為適當(dāng)?shù)念愋汀?例如:

 int[] myIntegers = (int[]) myResources.getObject("intList"); 

Java 平臺(tái)提供了 ResourceBundle 的兩個(gè)子類,ListResourceBundle 和 PropertyResourceBundle,它們提供了一種相當(dāng)簡(jiǎn)單的方法來創(chuàng)建資源。 正如您在前面的示例中簡(jiǎn)要看到的,ListResourceBundle 將其資源作為鍵/值對(duì)列表進(jìn)行管理。 PropertyResourceBundle 使用屬性文件來管理其資源。

如果 List ResourceBundle 或 PropertyResourceBundle 不適合您的需要,您可以編寫自己的 ResourceBundle 子類。 您的子類必須覆蓋兩個(gè)方法:處理 GetObject 和獲取 Keys()。

如果 ResourceBundle 子類同時(shí)被多個(gè)線程使用,則它的實(shí)現(xiàn)必須是線程安全的。 該類中非抽象方法的默認(rèn)實(shí)現(xiàn),以及直接已知的具體子類 ListResourceBundle 和 PropertyResourceBundle 中的方法都是線程安全的。

ResourceBundle.Control ResourceBundle.Control 類提供了通過采用 ResourceBundle.Control 實(shí)例的 getBundle 工廠方法執(zhí)行包加載過程所需的信息。 您可以實(shí)現(xiàn)自己的子類以啟用非標(biāo)準(zhǔn)資源包格式、更改搜索策略或定義緩存參數(shù)。

對(duì)于不采用 Control 實(shí)例的 getBundle 工廠方法,可以使用已安裝的 ResourceBundleControlProvider 實(shí)現(xiàn)來修改它們加載資源包的默認(rèn)行為。 在 ResourceBundle 類加載時(shí)檢測(cè)到任何已安裝的提供程序。 如果任何提供程序?yàn)榻o定的基本名稱提供了 Control,則將使用該 Control 而不是默認(rèn) Control。 如果安裝了多個(gè)服務(wù)提供者來支持相同的基本名稱,則將使用從 ServiceLoader 返回的第一個(gè)。

緩存管理 getBundle 工廠方法創(chuàng)建的資源包實(shí)例默認(rèn)被緩存,如果已經(jīng)緩存,工廠方法會(huì)多次返回同一個(gè)資源包實(shí)例。 getBundle 客戶端可以清除緩存,使用生存時(shí)間值管理緩存的資源包實(shí)例的生命周期,或者指定不緩存資源包實(shí)例。下面是 ResourceBundle 子類 MyResources 的一個(gè)非常簡(jiǎn)單的示例,它管理兩個(gè)資源(對(duì)于大量資源,您可能會(huì)使用 Map)。 請(qǐng)注意,如果“父級(jí)” ResourceBundle 處理具有相同值的相同鍵(如下面的 okKey),則不需要提供值。

 // default (English language, United States)
 public class MyResources extends ResourceBundle {
     public Object handleGetObject(String key) {
         if (key.equals("okKey")) return "Ok";
         if (key.equals("cancelKey")) return "Cancel";
         return null;
     }


     public Enumeration<String> getKeys() {
         return Collections.enumeration(keySet());
     }


     // Overrides handleKeySet() so that the getKeys() implementation
     // can rely on the keySet() value.
     protected Set<String> handleKeySet() {
         return new HashSet<String>(Arrays.asList("okKey", "cancelKey"));
     }
 }


 // German language
 public class MyResources_de extends MyResources {
     public Object handleGetObject(String key) {
         // don't need okKey, since parent level handles it.
         if (key.equals("cancelKey")) return "Abbrechen";
         return null;
     }


     protected Set<String> handleKeySet() {
         return new HashSet<String>(Arrays.asList("cancelKey"));
     }
 }

您不必限制自己使用單一系列的 ResourceBundle。 例如,您可以有一組用于異常消息的捆綁包 ExceptionResources (ExceptionResources_fr, ExceptionResources_de, ...),還有一個(gè)用于小部件的捆綁包 WidgetResource (WidgetResources_fr, WidgetResources_de, ...); 隨心所欲地分解資源。

嵌套類摘要

修飾符和類型 描述
static class ResourceBundle.Control ResourceBundle.Control 定義了一組回調(diào)方法,這些回調(diào)方法在包加載過程中由 ResourceBundle#getBundle(String, Locale, ClassLoader, Control) 工廠方法調(diào)用。

字段摘要

修飾符和類型 字段 描述
protected ResourceBundle parent 此捆綁包的父捆綁包。

構(gòu)造函數(shù)摘要

構(gòu)造函數(shù) 描述
ResourceBundle() 唯一的構(gòu)造函數(shù)。

方法總結(jié)

修飾符和類型 方法 描述
static void clearCache() 從緩存中刪除所有已使用調(diào)用者的類加載器加載的資源包。
static void clearCache(ClassLoader loader) 從緩存中刪除所有使用給定類加載器加載的資源包。
boolean containsKey(String key) 確定給定鍵是否包含在此 ResourceBundle 或其父捆綁包中。
String getBaseBundleName() 如果已知,則返回此捆綁包的基本名稱,如果未知,則返回 null。
static ResourceBundle getBundle(String baseName) 使用指定的基本名稱、默認(rèn)語(yǔ)言環(huán)境和調(diào)用者的類加載器獲取資源包。
static ResourceBundle getBundle(String baseName, Locale locale) 使用指定的基本名稱和語(yǔ)言環(huán)境以及調(diào)用者的類加載器獲取資源包。
static ResourceBundle getBundle(String baseName, Locale locale, ClassLoader loader) 使用指定的基本名稱、語(yǔ)言環(huán)境和類加載器獲取資源包。
static ResourceBundle getBundle(String baseName, Locale targetLocale, ClassLoader loader, ResourceBundle.Control control) 使用指定的基本名稱、目標(biāo)語(yǔ)言環(huán)境、類加載器和控件返回資源包。
static ResourceBundle getBundle(String baseName, Locale targetLocale, ResourceBundle.Control control) 使用指定的基本名稱、目標(biāo)語(yǔ)言環(huán)境和控件以及調(diào)用者的類加載器返回資源包。
static ResourceBundle getBundle(String baseName, ResourceBundle.Control control) 使用指定的基本名稱、默認(rèn)語(yǔ)言環(huán)境和指定的控件返回資源包。
abstract EnumerationString getKeys() 返回鍵的枚舉。
Locale getLocale() 返回此資源包的語(yǔ)言環(huán)境。
Object getObject(String key) 從此資源包或其父資源包中獲取給定鍵的對(duì)象。
String getString(String key) 從此資源包或其父資源包中獲取給定鍵的字符串。
String[] getStringArray(String key) 從此資源包或其父資源包中獲取給定鍵的字符串?dāng)?shù)組。
protected abstract Object handleGetObject(String key) 從此資源包中獲取給定鍵的對(duì)象。
protected SetString handleKeySet() 返回僅包含在此 ResourceBundle 中的一組鍵。
SetString keySet() 返回包含在此 ResourceBundle 及其父捆綁包中的所有鍵的 Set。
protected void setParent(ResourceBundle parent) 設(shè)置此捆綁包的父捆綁包。
從類 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

字段詳細(xì)信息

parent

protected ResourceBundle parent

此捆綁包的父捆綁包。 當(dāng)此捆綁包不包含特定資源時(shí),getObject 將搜索父捆綁包。

構(gòu)造函數(shù)詳細(xì)信息

ResourceBundle

public ResourceBundle()

唯一的構(gòu)造函數(shù)。 (用于子類構(gòu)造函數(shù)的調(diào)用,通常是隱式的。)

方法詳情

getBaseBundleName

public String getBaseBundleName()

如果已知,則返回此捆綁包的基本名稱,如果未知,則返回 null。 如果不為 null,則這是加載資源包時(shí)傳遞給 ResourceBundle.getBundle(...) 方法的 baseName 參數(shù)的值。

返回:

資源包的基本名稱,由 ResourceBundle.getBundle(...) 方法提供和預(yù)期。

getString

public final String getString(String key)

從此資源包或其父資源包中獲取給定鍵的字符串。 調(diào)用該方法相當(dāng)于調(diào)用

(String) getObject(key).

參數(shù):

參數(shù)名稱 參數(shù)描述
key 所需字符串的鍵

返回:

給定鍵的字符串

Throws:

Throw名稱 Throw描述
NullPointerException 如果 key 為空
MissingResourceException 如果找不到給定鍵的對(duì)象
ClassCastException 如果為給定鍵找到的對(duì)象不是字符串

getStringArray

public final String[] getStringArray(String key)

從此資源包或其父資源包中獲取給定鍵的字符串?dāng)?shù)組。 調(diào)用該方法相當(dāng)于調(diào)用

(String[]) getObject(key).

參數(shù):

參數(shù)名稱 參數(shù)描述
key 所需字符串?dāng)?shù)組的鍵

返回:

給定鍵的字符串?dāng)?shù)組

Throws:

Throw名稱 Throw描述
NullPointerException 如果 key 為空
MissingResourceException 如果找不到給定鍵的對(duì)象
ClassCastException 如果為給定鍵找到的對(duì)象不是字符串?dāng)?shù)組

getObject

public final Object getObject(String key)

從此資源包或其父資源包中獲取給定鍵的對(duì)象。 此方法首先嘗試使用 handleGetObject 從此資源包中獲取對(duì)象。 如果不成功,并且父資源包不為空,則調(diào)用父資源的 getObject 方法。 如果仍然不成功,則拋出 MissingResourceException。

參數(shù):

參數(shù)名稱 參數(shù)描述
key 所需對(duì)象的鍵

返回:

給定鍵的對(duì)象

Throws:

Throw名稱 Throw描述
NullPointerException 如果 key 為空
MissingResourceException 如果找不到給定鍵的對(duì)象

getLocale

public Locale getLocale()

返回此資源包的語(yǔ)言環(huán)境。 在調(diào)用 getBundle() 之后可以使用此方法來確定返回的資源包是否真的對(duì)應(yīng)于請(qǐng)求的語(yǔ)言環(huán)境或者是一個(gè)后備。

返回:

此資源包的語(yǔ)言環(huán)境

setParent

protected void setParent(ResourceBundle parent)

設(shè)置此捆綁包的父捆綁包。 當(dāng)此捆綁包不包含特定資源時(shí),getObject 將搜索父捆綁包。

參數(shù):

參數(shù)名稱 參數(shù)描述
parent 此捆綁包的父捆綁包。

getBundle

public static final ResourceBundle getBundle(String baseName)

使用指定的基本名稱、默認(rèn)語(yǔ)言環(huán)境和調(diào)用者的類加載器獲取資源包。 調(diào)用該方法相當(dāng)于調(diào)用

getBundle(baseName, Locale.getDefault(), this.getClass().getClassLoader()),

除了 getClassLoader() 以 ResourceBundle 的安全權(quán)限運(yùn)行。

參數(shù):

參數(shù)名稱 參數(shù)描述
baseName 資源包的基本名稱,完全限定的類名

返回:

給定基本名稱和默認(rèn)語(yǔ)言環(huán)境的資源包

Throws:

Throw名稱 Throw描述
NullPointerException 如果 baseName 為空
MissingResourceException 如果找不到指定基本名稱的資源包

getBundle

public static final ResourceBundle getBundle(String baseName, ResourceBundle.Control control)

使用指定的基本名稱、默認(rèn)語(yǔ)言環(huán)境和指定的控件返回資源包。 調(diào)用該方法相當(dāng)于調(diào)用

 getBundle(baseName, Locale.getDefault(),
           this.getClass().getClassLoader(), control),

除了 getClassLoader() 以 ResourceBundle 的安全權(quán)限運(yùn)行。

參數(shù):

參數(shù)名稱 參數(shù)描述
baseName 資源包的基本名稱,完全限定的類名
control 為資源包加載過程提供信息的控件

返回:

給定基本名稱和默認(rèn)語(yǔ)言環(huán)境的資源包

Throws:

Throw名稱 Throw描述
NullPointerException 如果 baseName 或 control 為空
MissingResourceException 如果找不到指定基本名稱的資源包
IllegalArgumentException 如果給定的控件沒有正確執(zhí)行(例如,control.getCandidateLocales 返回 null。)請(qǐng)注意,控件的驗(yàn)證是根據(jù)需要執(zhí)行的。

getBundle

public static final ResourceBundle getBundle(String baseName, Locale locale)

使用指定的基本名稱和語(yǔ)言環(huán)境以及調(diào)用者的類加載器獲取資源包。 調(diào)用該方法相當(dāng)于調(diào)用

getBundle(baseName, locale, this.getClass().getClassLoader()),

除了 getClassLoader() 以 ResourceBundle 的安全權(quán)限運(yùn)行。

參數(shù):

參數(shù)名稱 參數(shù)描述
baseName 資源包的基本名稱,完全限定的類名
locale 需要資源包的語(yǔ)言環(huán)境

返回:

給定基本名稱和語(yǔ)言環(huán)境的資源包

Throws:

Throw名稱 Throw描述
NullPointerException 如果 baseName 或 locale 為 null
MissingResourceException 如果找不到指定基本名稱的資源包

getBundle

public static final ResourceBundle getBundle(String baseName, Locale targetLocale, ResourceBundle.Control control)

使用指定的基本名稱、目標(biāo)語(yǔ)言環(huán)境和控件以及調(diào)用者的類加載器返回資源包。 調(diào)用該方法相當(dāng)于調(diào)用

 getBundle(baseName, targetLocale, this.getClass().getClassLoader(),
           control),

除了 getClassLoader() 以 ResourceBundle 的安全權(quán)限運(yùn)行。

參數(shù):

參數(shù)名稱 參數(shù)描述
baseName 資源包的基本名稱,完全限定的類名
targetLocale 需要資源包的語(yǔ)言環(huán)境
control 為資源包加載過程提供信息的控件

返回:

給定基本名稱的資源包和語(yǔ)言環(huán)境中的語(yǔ)言環(huán)境

Throws:

Throw名稱 Throw描述
NullPointerException 如果 baseName、locales 或 control 為 null
MissingResourceException 如果在任何語(yǔ)言環(huán)境中都找不到指定基本名稱的資源包。
IllegalArgumentException 如果給定的控件沒有正確執(zhí)行(例如,control.getCandidateLocales 返回 null。)請(qǐng)注意,控件的驗(yàn)證是根據(jù)需要執(zhí)行的。

getBundle

public static ResourceBundle getBundle(String baseName, Locale locale, ClassLoader loader)

使用指定的基本名稱、語(yǔ)言環(huán)境和類加載器獲取資源包。

此方法的行為與調(diào)用 getBundle(java.lang.String,java.util.Locale,java.lang.ClassLoader,java.util.ResourceBundle.Control) 并傳遞 Control 的默認(rèn)實(shí)例相同,除非 ResourceBundleControlProvider SPI 提供了另一個(gè) Control . 參考修改默認(rèn)行為的說明。

下面描述了默認(rèn)行為。

getBundle 使用基本名稱、指定的語(yǔ)言環(huán)境和默認(rèn)語(yǔ)言環(huán)境(從 Locale.getDefault 獲得)來生成一系列候選包名稱。 如果指定語(yǔ)言環(huán)境的語(yǔ)言、腳本、國(guó)家和變體都是空字符串,則基本名稱是唯一的候選包名稱。 否則,將根據(jù)指定區(qū)域設(shè)置(語(yǔ)言、腳本、國(guó)家和變體)的屬性值生成候選區(qū)域設(shè)置列表,并將其附加到基本名稱。 通常,這將如下所示:

     baseName + "_" + language + "_" + script + "_" + country + "_" + variant
     baseName + "_" + language + "_" + script + "_" + country
     baseName + "_" + language + "_" + script
     baseName + "_" + language + "_" + country + "_" + variant
     baseName + "_" + language + "_" + country
     baseName + "_" + language

最后一個(gè)組件為空字符串的候選包名稱以及下劃線將被省略。 例如,如果 country 是一個(gè)空字符串,則上面的第二個(gè)和第五個(gè)候選捆綁包名稱將被省略。 此外,如果 script 為空字符串,則省略包括 script 在內(nèi)的候選名稱。 例如,語(yǔ)言為“de”且變體為“JAVA”的語(yǔ)言環(huán)境將生成以下基本名稱為“MyResource”的候選名稱。

     MyResource_de__JAVA
     MyResource_de

在變體包含一個(gè)或多個(gè)下劃線 ('_') 的情況下,通過截?cái)嘧詈笠粋€(gè)下劃線及其后面的部分生成的包名稱序列將插入到具有原始變體的候選包名稱之后。 例如,對(duì)于語(yǔ)言為“en”、腳本“Latn”、國(guó)家/地區(qū)“US”和變體“WINDOWS_VISTA”以及捆綁包基本名稱“MyResource”的語(yǔ)言環(huán)境,將生成以下候選捆綁包名稱列表:

 MyResource_en_Latn_US_WINDOWS_VISTA
 MyResource_en_Latn_US_WINDOWS
 MyResource_en_Latn_US
 MyResource_en_Latn
 MyResource_en_US_WINDOWS_VISTA
 MyResource_en_US_WINDOWS
 MyResource_en_US
 MyResource_en

注意:對(duì)于某些語(yǔ)言環(huán)境,候選捆綁包名稱列表包含額外的名稱,或者捆綁包名稱的順序略有修改。

getBundle 然后遍歷候選包名稱以找到第一個(gè)可以實(shí)例化實(shí)際資源包的名稱。 它使用默認(rèn)控件的 Control#getFormats 方法,該方法為每個(gè)生成的名稱生成兩個(gè)包名稱,第一個(gè)是類名,第二個(gè)是屬性文件名。 對(duì)于每個(gè)候選包名稱,它會(huì)嘗試創(chuàng)建一個(gè)資源包:

  • 首先,它嘗試使用生成的類名加載一個(gè)類。 如果可以使用指定的類加載器找到并加載這樣的類,與 ResourceBundle 的分配兼容,可以從 ResourceBundle 訪問,并且可以實(shí)例化,則 getBundle 創(chuàng)建此類的新實(shí)例并將其用作結(jié)果資源包。
  • 否則,getBundle 會(huì)嘗試使用生成的屬性文件名來定位屬性資源文件。 它通過替換所有“?!睆暮蜻x包名稱生成路徑名稱。 帶有“/”的字符并附加字符串“.properties”。 它嘗試使用 ClassLoader.getResource 查找具有此名稱的“資源”。 (請(qǐng)注意,getResource 意義上的“資源”與資源包的內(nèi)容無關(guān),它只是數(shù)據(jù)的容器,例如文件。)如果找到“資源”,它會(huì)嘗試創(chuàng)建 從其內(nèi)容中創(chuàng)建一個(gè)新的 PropertyResourceBundle 實(shí)例。 如果成功,此實(shí)例將成為結(jié)果資源包。

這一直持續(xù)到結(jié)果資源包被實(shí)例化或候選包名稱列表用完為止。 如果沒有找到匹配的資源包,則調(diào)用默認(rèn)控件的 Control#getFallbackLocale 方法,該方法返回當(dāng)前的默認(rèn)語(yǔ)言環(huán)境。 使用此語(yǔ)言環(huán)境生成一個(gè)新的候選語(yǔ)言環(huán)境名稱序列,并再次搜索,如上所述。

如果仍然沒有找到結(jié)果包,則僅查找基本名稱。 如果這仍然失敗,則會(huì)引發(fā) MissingResourceException。

一旦找到結(jié)果資源包,就會(huì)實(shí)例化其父鏈。 如果結(jié)果包已經(jīng)有一個(gè)父級(jí)(可能是因?yàn)樗菑木彺嬷蟹祷氐模?,則鏈?zhǔn)峭暾摹?/p>

否則,getBundle 會(huì)檢查在生成結(jié)果資源包的過程中使用的候選語(yǔ)言環(huán)境列表的其余部分。 (和以前一樣,最終組件為空字符串的候選包名稱被省略。)當(dāng)涉及到候選列表的末尾時(shí),它會(huì)嘗試純包名稱。 對(duì)于每個(gè)候選包名稱,它都會(huì)嘗試實(shí)例化一個(gè)資源包(首先查找一個(gè)類,然后查找一個(gè)屬性文件,如上所述)。

無論何時(shí)成功,它都會(huì)使用新的資源包調(diào)用先前實(shí)例化的資源包的 setParent 方法。 這一直持續(xù)到名稱列表用完或當(dāng)前捆綁包已經(jīng)有一個(gè)非空父級(jí)。

父鏈完成后,將返回捆綁包。

注意:getBundle 緩存實(shí)例化的資源包,并可能多次返回相同的資源包實(shí)例。

注意:baseName 參數(shù)應(yīng)該是一個(gè)完全限定的類名。 但是,為了與早期版本兼容,Sun 的 Java SE 運(yùn)行時(shí)環(huán)境不會(huì)驗(yàn)證這一點(diǎn),因此可以通過指定路徑名(使用“/”)而不是完全限定的類名(使用“.”)來訪問 PropertyResourceBundles .

例子:

提供了以下類和屬性文件:

     MyResources.class
     MyResources.properties
     MyResources_fr.properties
     MyResources_fr_CH.class
     MyResources_fr_CH.properties
     MyResources_en.properties
     MyResources_es_ES.class

所有文件的內(nèi)容都是有效的(即“.class”文件的 ResourceBundle 的公共非抽象子類,語(yǔ)法正確的“.properties”文件)。 默認(rèn)語(yǔ)言環(huán)境是 Locale("en", "GB")。

使用以下語(yǔ)言環(huán)境參數(shù)調(diào)用 getBundle 將實(shí)例化資源包,如下所示:

文件 MyResources_fr_CH.properties 從未使用過,因?yàn)樗?MyResources_fr_CH.class 隱藏。 同樣,MyResources.properties 也被 MyResources.class 隱藏。

參數(shù):

參數(shù)名稱 參數(shù)描述
baseName 資源包的基本名稱,完全限定的類名
locale 需要資源包的語(yǔ)言環(huán)境
loader 加載資源包的類加載器

返回:

給定基本名稱和語(yǔ)言環(huán)境的資源包

Throws:

Throw名稱 Throw描述
NullPointerException 如果 baseName、locale 或 loader 為 null
MissingResourceException 如果找不到指定基本名稱的資源包

getBundle

public static ResourceBundle getBundle(String baseName, Locale targetLocale, ClassLoader loader, ResourceBundle.Control control)

使用指定的基本名稱、目標(biāo)語(yǔ)言環(huán)境、類加載器和控件返回資源包。 與沒有 controlargument 的 getBundlefactory 方法不同,給定的控件指定如何定位和實(shí)例化資源包。 從概念上講,具有給定控件的包加載過程在以下步驟中執(zhí)行。

  1. 此工廠方法在緩存中查找指定 baseName、targetLocale 和 loader 的資源包。 如果在緩存中找到所請(qǐng)求的資源包實(shí)例,并且該實(shí)例及其所有父實(shí)例的生存時(shí)間都未到期,則將該實(shí)例返回給調(diào)用者。 否則,這個(gè)工廠方法會(huì)繼續(xù)下面的加載過程。
  2. 調(diào)用 ResourceBundle.Control#getFormats(String) 方法來獲取資源包格式以生成包或資源名稱。 字符串“java.class”和“java.properties”分別指定基于類和基于PropertyResourceBundle 的資源包。 其他以“java”開頭的字符串。 保留用于將來的擴(kuò)展,不得用于應(yīng)用程序定義的格式。 其他字符串指定應(yīng)用程序定義的格式。
  3. 使用目標(biāo)語(yǔ)言環(huán)境調(diào)用 ResourceBundle.Control#getCandidateLocales(String, Locale) 方法以獲取搜索資源包的候選語(yǔ)言環(huán)境列表。
  4. 調(diào)用 ResourceBundle.Control#newBundle(String, Locale, String, ClassLoader, boolean) 方法來為基本包名稱、候選區(qū)域設(shè)置和格式實(shí)例化 ResourceBundle。 (請(qǐng)參閱下面有關(guān)緩存查找的注釋。)此步驟迭代候選語(yǔ)言環(huán)境和格式的所有組合,直到 newBundle 方法返回 ResourceBundle 實(shí)例或迭代已用完所有組合。 例如,如果候選語(yǔ)言環(huán)境是 Locale("de", "DE")、Locale("de") 和 Locale("") 并且格式是 "java.class" 和 "java.properties",則以下 是用于調(diào)用 control.newBundle 的區(qū)域設(shè)置格式組合序列。
  5. 如果上一步?jīng)]有找到資源包,則繼續(xù)步驟 6。如果找到的包是基本包(Locale("") 的包),并且候選語(yǔ)言環(huán)境列表僅包含 Locale(""), 將捆綁包返回給調(diào)用者。 如果發(fā)現(xiàn)一個(gè)捆綁包是基本捆綁包,但候選語(yǔ)言環(huán)境列表包含 Locale("") 以外的語(yǔ)言環(huán)境,則暫停捆綁包并繼續(xù)執(zhí)行步驟 6。如果發(fā)現(xiàn)一個(gè)捆綁包不是基礎(chǔ)捆綁包 ,繼續(xù)執(zhí)行步驟 7。
  6. 調(diào)用 ResourceBundle.Control#getFallbackLocale(String, Locale) 方法來獲取備用語(yǔ)言環(huán)境(替代當(dāng)前目標(biāo)語(yǔ)言環(huán)境)以嘗試進(jìn)一步查找資源包。 如果該方法返回一個(gè)非空語(yǔ)言環(huán)境,它將成為下一個(gè)目標(biāo)語(yǔ)言環(huán)境,并且加載過程從第 3 步開始。否則,如果在前面的第 5 步中找到并擱置了一個(gè)基本包,則將其返回給調(diào)用者 現(xiàn)在。 否則,將引發(fā) MissingResourceException。
  7. 至此,我們找到了一個(gè)不是基本包的資源包。 如果此捆綁包在其實(shí)例化期間設(shè)置了其父級(jí),則將其返回給調(diào)用者。 否則,它的父鏈會(huì)根據(jù)它所在的候選區(qū)域列表進(jìn)行實(shí)例化。 最后,捆綁包返回給調(diào)用者。

在上面的資源包加載過程中,這個(gè)工廠方法會(huì)在調(diào)用 Control#newBundle(String, Locale, String, ClassLoader, boolean) 方法之前查找緩存。 如果緩存中找到的資源包的生存期已經(jīng)過期,工廠方法調(diào)用ResourceBundle.Control#needsReload(String, Locale, String, ClassLoader, ResourceBundle, long)方法判斷資源包是否需要 要重新加載。 如果需要重新加載,工廠方法調(diào)用 control.newBundle 來重新加載資源包。 如果 control.newBundle 返回 null,工廠方法會(huì)將一個(gè)虛擬資源包放入緩存中,作為不存在資源包的標(biāo)記,以避免后續(xù)請(qǐng)求的查找開銷。 此類虛擬資源束處于與 control 指定的相同的過期控制之下。

默認(rèn)情況下,所有加載的資源包都被緩存。

以下是使用默認(rèn) ResourceBundle.Control 實(shí)現(xiàn)的包加載過程的示例。

條件:

  • 基本包名稱:foo.bar.Messages
  • 請(qǐng)求的語(yǔ)言環(huán)境:Locale#ITALY
  • 默認(rèn)語(yǔ)言環(huán)境:語(yǔ)言環(huán)境#FRENCH
  • 可用資源包:foo/bar/Messages_fr.properties 和 foo/bar/Messages.properties

首先,getBundle 嘗試按以下順序加載資源包。

  • 類 foo.bar.Messages_it_IT
  • 文件 foo/bar/Messages_it_IT.properties
  • 類 foo.bar.Messages_it
  • 文件 foo/bar/Messages_it.properties
  • 類 foo.bar.Messages
  • 文件 foo/bar/Messages.properties

此時(shí),getBundle 找到 foo/bar/Messages.properties,因?yàn)樗腔景?,所以將其擱置。 getBundle 調(diào)用返回 Locale.FRENCH 的 Control#getFallbackLocale(String, Locale)。 接下來,getBundle 嘗試按以下順序加載包。

  • 類 foo.bar.Messages_fr
  • 文件 foo/bar/Messages_fr.properties
  • 類 foo.bar.Messages
  • 文件 foo/bar/Messages.properties

getBundle 找到 foo/bar/Messages_fr.properties 并創(chuàng)建一個(gè) ResourceBundle 實(shí)例。 然后,getBundle 從候選語(yǔ)言環(huán)境列表中設(shè)置其父鏈。 在列表中僅找到 foo/bar/Messages.properties,getBundle 創(chuàng)建一個(gè) ResourceBundle 實(shí)例,該實(shí)例成為 foo/bar/Messages_fr.properties 實(shí)例的父級(jí)。

參數(shù):

參數(shù)名稱 參數(shù)描述
baseName 資源包的基本名稱,完全限定的類名
targetLocale 需要資源包的語(yǔ)言環(huán)境
loader 加載資源包的類加載器
control 為資源包加載過程提供信息的控件

返回:

給定基本名稱和語(yǔ)言環(huán)境的資源包

Throws:

Throw名稱 Throw描述
NullPointerException 如果 baseName、targetLocale、loader 或 control 為 null
MissingResourceException 如果找不到指定基本名稱的資源包
IllegalArgumentException 如果給定的控件沒有正確執(zhí)行(例如,control.getCandidateLocales 返回 null。)請(qǐng)注意,控件的驗(yàn)證是根據(jù)需要執(zhí)行的。

clearCache

public static final void clearCache()

從緩存中刪除所有已使用調(diào)用者的類加載器加載的資源包。

clearCache

public static final void clearCache(ClassLoader loader)

從緩存中刪除所有使用給定類加載器加載的資源包。

參數(shù):

參數(shù)名稱 參數(shù)描述
loader 類加載器

Throws:

Throw名稱 Throw描述
NullPointerException 如果 loader 為空

handleGetObject

protected abstract Object handleGetObject(String key)

從此資源包中獲取給定鍵的對(duì)象。 如果此資源包不包含給定鍵的對(duì)象,則返回 null。

參數(shù):

參數(shù)名稱 參數(shù)描述
key 所需對(duì)象的鍵

返回:

給定鍵的對(duì)象,或 null

Throws:

Throw名稱 Throw描述
NullPointerException 如果 key 為空

getKeys

public abstract EnumerationString getKeys()

返回鍵的枚舉。

返回:

此 ResourceBundle 及其父捆綁包中包含的鍵的枚舉。

containsKey

public boolean containsKey(String key)

確定給定鍵是否包含在此 ResourceBundle 或其父捆綁包中。

參數(shù):

參數(shù)名稱 參數(shù)描述
key 資源鍵

返回:

如果給定鍵包含在此 ResourceBundle 或其父包中,則為 true; 否則為 false。

Throws:

Throw名稱 Throw描述
NullPointerException 如果 key 為空

keySet

public SetString keySet()

返回包含在此 ResourceBundle 及其父捆綁包中的所有鍵的 Set。

返回:

此 ResourceBundle 及其父捆綁包中包含的所有鍵的集合。

handleKeySet

protected SetString handleKeySet()

返回僅包含在此 ResourceBundle 中的一組鍵。

默認(rèn)實(shí)現(xiàn)返回由 getKeys 方法返回的一組鍵,除了 handleGetObject 方法返回 null 的鍵。 創(chuàng)建 Set 后,該值將保存在此 ResourceBundle 中,以避免在后續(xù)調(diào)用中生成相同的 Set。 子類可以重寫此方法以加快處理速度。

返回:

僅包含在此 ResourceBundle 中的一組鍵

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)