java.lang.Object
|---java.util.ResourceBundle
public abstract class ResourceBundle
extends Object
资源包包含特定于语言环境的对象。 当您的程序需要特定于语言环境的资源(例如字符串)时,您的程序可以从适合当前用户语言环境的资源包中加载它。 通过这种方式,您可以编写在很大程度上独立于用户语言环境的程序代码,从而将资源包中的大多数(如果不是全部)特定于语言环境的信息隔离开来。
这使您可以编写能够:
资源包属于其成员共享一个通用基本名称的系列,但其名称还具有标识其语言环境的附加组件。 例如,资源包系列的基本名称可能是“MyResources”。 该系列应该有一个默认资源包,它与它的系列具有相同的名称 - “MyResources” - 如果不支持特定的语言环境,它将被用作最后的资源包。 然后,该家族可以根据需要提供尽可能多的特定于语言环境的成员,例如名为“MyResources_de”的德国成员。
一个系列中的每个资源包都包含相同的项目,但这些项目已针对该资源包所代表的语言环境进行了翻译。 例如,“MyResources”和“MyResources_de”都可能有一个用于取消操作的按钮的字符串。 在“MyResources”中,字符串可能包含“Cancel”,而在“MyResources_de”中,它可能包含“Abbrechen”。
如果不同国家有不同的资源,您可以进行专门化:例如,“MyResources_de_CH”包含瑞士 (CH) 的德语 (de) 对象。 如果您只想修改专精中的部分资源,您可以这样做。
当您的程序需要特定于语言环境的对象时,它会使用 getBundle 方法加载 ResourceBundle 类:
ResourceBundle myResources =
ResourceBundle.getBundle("MyResources", currentLocale);
资源包包含键/值对。 这些键唯一地标识包中特定于语言环境的对象。 下面是一个包含两个键/值对的 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”——但它们不是必须的。 这些值可以是任何类型的对象。
您可以使用适当的 getter 方法从资源包中检索对象。 因为 "OkKey" 和 "CancelKey" 都是字符串,所以您可以使用 getString 来检索它们:
button1 = new Button(myResources.getString("OkKey"));
button2 = new Button(myResources.getString("CancelKey"));
getter 方法都需要键作为参数,如果找到则返回对象。 如果找不到对象,getter 方法会抛出 MissingResourceException。
除了 getString,ResourceBundle 还提供了获取字符串数组的方法 getStringArray,以及用于任何其他类型对象的通用 getObject 方法。 使用 getObject 时,您必须将结果转换为适当的类型。 例如:
int[] myIntegers = (int[]) myResources.getObject("intList");
Java 平台提供了 ResourceBundle 的两个子类,ListResourceBundle 和 PropertyResourceBundle,它们提供了一种相当简单的方法来创建资源。 正如您在前面的示例中简要看到的,ListResourceBundle 将其资源作为键/值对列表进行管理。 PropertyResourceBundle 使用属性文件来管理其资源。
如果 List ResourceBundle 或 PropertyResourceBundle 不适合您的需要,您可以编写自己的 ResourceBundle 子类。 您的子类必须覆盖两个方法:处理 GetObject 和获取 Keys()。
如果 ResourceBundle 子类同时被多个线程使用,则它的实现必须是线程安全的。 该类中非抽象方法的默认实现,以及直接已知的具体子类 ListResourceBundle 和 PropertyResourceBundle 中的方法都是线程安全的。
ResourceBundle.Control ResourceBundle.Control 类提供了通过采用 ResourceBundle.Control 实例的 getBundle 工厂方法执行包加载过程所需的信息。 您可以实现自己的子类以启用非标准资源包格式、更改搜索策略或定义缓存参数。
对于不采用 Control 实例的 getBundle 工厂方法,可以使用已安装的 ResourceBundleControlProvider 实现来修改它们加载资源包的默认行为。 在 ResourceBundle 类加载时检测到任何已安装的提供程序。 如果任何提供程序为给定的基本名称提供了 Control,则将使用该 Control 而不是默认 Control。 如果安装了多个服务提供者来支持相同的基本名称,则将使用从 ServiceLoader 返回的第一个。
缓存管理 getBundle 工厂方法创建的资源包实例默认被缓存,如果已经缓存,工厂方法会多次返回同一个资源包实例。 getBundle 客户端可以清除缓存,使用生存时间值管理缓存的资源包实例的生命周期,或者指定不缓存资源包实例。下面是 ResourceBundle 子类 MyResources 的一个非常简单的示例,它管理两个资源(对于大量资源,您可能会使用 Map)。 请注意,如果“父级” 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, ...),还有一个用于小部件的捆绑包 WidgetResource (WidgetResources_fr, WidgetResources_de, ...); 随心所欲地分解资源。
修饰符和类型 | 类 | 描述 |
---|---|---|
static class | ResourceBundle.Control | ResourceBundle.Control 定义了一组回调方法,这些回调方法在包加载过程中由 ResourceBundle#getBundle(String, Locale, ClassLoader, Control) 工厂方法调用。 |
修饰符和类型 | 字段 | 描述 |
---|---|---|
protected ResourceBundle | parent | 此捆绑包的父捆绑包。 |
构造函数 | 描述 |
---|---|
ResourceBundle() | 唯一的构造函数。 |
修饰符和类型 | 方法 | 描述 |
---|---|---|
static void | clearCache() | 从缓存中删除所有已使用调用者的类加载器加载的资源包。 |
static void | clearCache(ClassLoader loader) | 从缓存中删除所有使用给定类加载器加载的资源包。 |
boolean | containsKey(String key) | 确定给定键是否包含在此 ResourceBundle 或其父捆绑包中。 |
String | getBaseBundleName() | 如果已知,则返回此捆绑包的基本名称,如果未知,则返回 null。 |
static ResourceBundle | getBundle(String baseName) | 使用指定的基本名称、默认语言环境和调用者的类加载器获取资源包。 |
static ResourceBundle | getBundle(String baseName, Locale locale) | 使用指定的基本名称和语言环境以及调用者的类加载器获取资源包。 |
static ResourceBundle | getBundle(String baseName, Locale locale, ClassLoader loader) | 使用指定的基本名称、语言环境和类加载器获取资源包。 |
static ResourceBundle | getBundle(String baseName, Locale targetLocale, ClassLoader loader, ResourceBundle.Control control) | 使用指定的基本名称、目标语言环境、类加载器和控件返回资源包。 |
static ResourceBundle | getBundle(String baseName, Locale targetLocale, ResourceBundle.Control control) | 使用指定的基本名称、目标语言环境和控件以及调用者的类加载器返回资源包。 |
static ResourceBundle | getBundle(String baseName, ResourceBundle.Control control) | 使用指定的基本名称、默认语言环境和指定的控件返回资源包。 |
abstract EnumerationString | getKeys() | 返回键的枚举。 |
Locale | getLocale() | 返回此资源包的语言环境。 |
Object | getObject(String key) | 从此资源包或其父资源包中获取给定键的对象。 |
String | getString(String key) | 从此资源包或其父资源包中获取给定键的字符串。 |
String[] | getStringArray(String key) | 从此资源包或其父资源包中获取给定键的字符串数组。 |
protected abstract Object | handleGetObject(String key) | 从此资源包中获取给定键的对象。 |
protected SetString | handleKeySet() | 返回仅包含在此 ResourceBundle 中的一组键。 |
SetString | keySet() | 返回包含在此 ResourceBundle 及其父捆绑包中的所有键的 Set。 |
protected void | setParent(ResourceBundle parent) | 设置此捆绑包的父捆绑包。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
protected ResourceBundle parent
此捆绑包的父捆绑包。 当此捆绑包不包含特定资源时,getObject 将搜索父捆绑包。
public ResourceBundle()
唯一的构造函数。 (用于子类构造函数的调用,通常是隐式的。)
public String getBaseBundleName()
如果已知,则返回此捆绑包的基本名称,如果未知,则返回 null。 如果不为 null,则这是加载资源包时传递给 ResourceBundle.getBundle(...) 方法的 baseName 参数的值。
返回:
资源包的基本名称,由 ResourceBundle.getBundle(...) 方法提供和预期。
public final String getString(String key)
从此资源包或其父资源包中获取给定键的字符串。 调用该方法相当于调用
(String) getObject(key).
参数:
参数名称 | 参数描述 |
---|---|
key | 所需字符串的键 |
返回:
给定键的字符串
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果 key 为空 |
MissingResourceException | 如果找不到给定键的对象 |
ClassCastException | 如果为给定键找到的对象不是字符串 |
public final String[] getStringArray(String key)
从此资源包或其父资源包中获取给定键的字符串数组。 调用该方法相当于调用
(String[]) getObject(key).
参数:
参数名称 | 参数描述 |
---|---|
key | 所需字符串数组的键 |
返回:
给定键的字符串数组
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果 key 为空 |
MissingResourceException | 如果找不到给定键的对象 |
ClassCastException | 如果为给定键找到的对象不是字符串数组 |
public final Object getObject(String key)
从此资源包或其父资源包中获取给定键的对象。 此方法首先尝试使用 handleGetObject 从此资源包中获取对象。 如果不成功,并且父资源包不为空,则调用父资源的 getObject 方法。 如果仍然不成功,则抛出 MissingResourceException。
参数:
参数名称 | 参数描述 |
---|---|
key | 所需对象的键 |
返回:
给定键的对象
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果 key 为空 |
MissingResourceException | 如果找不到给定键的对象 |
public Locale getLocale()
返回此资源包的语言环境。 在调用 getBundle() 之后可以使用此方法来确定返回的资源包是否真的对应于请求的语言环境或者是一个后备。
返回:
此资源包的语言环境
protected void setParent(ResourceBundle parent)
设置此捆绑包的父捆绑包。 当此捆绑包不包含特定资源时,getObject 将搜索父捆绑包。
参数:
参数名称 | 参数描述 |
---|---|
parent | 此捆绑包的父捆绑包。 |
public static final ResourceBundle getBundle(String baseName)
使用指定的基本名称、默认语言环境和调用者的类加载器获取资源包。 调用该方法相当于调用
getBundle(baseName, Locale.getDefault(), this.getClass().getClassLoader()),
除了 getClassLoader() 以 ResourceBundle 的安全权限运行。
参数:
参数名称 | 参数描述 |
---|---|
baseName | 资源包的基本名称,完全限定的类名 |
返回:
给定基本名称和默认语言环境的资源包
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果 baseName 为空 |
MissingResourceException | 如果找不到指定基本名称的资源包 |
public static final ResourceBundle getBundle(String baseName, ResourceBundle.Control control)
使用指定的基本名称、默认语言环境和指定的控件返回资源包。 调用该方法相当于调用
getBundle(baseName, Locale.getDefault(),
this.getClass().getClassLoader(), control),
除了 getClassLoader() 以 ResourceBundle 的安全权限运行。
参数:
参数名称 | 参数描述 |
---|---|
baseName | 资源包的基本名称,完全限定的类名 |
control | 为资源包加载过程提供信息的控件 |
返回:
给定基本名称和默认语言环境的资源包
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果 baseName 或 control 为空 |
MissingResourceException | 如果找不到指定基本名称的资源包 |
IllegalArgumentException | 如果给定的控件没有正确执行(例如,control.getCandidateLocales 返回 null。)请注意,控件的验证是根据需要执行的。 |
public static final ResourceBundle getBundle(String baseName, Locale locale)
使用指定的基本名称和语言环境以及调用者的类加载器获取资源包。 调用该方法相当于调用
getBundle(baseName, locale, this.getClass().getClassLoader()),
除了 getClassLoader() 以 ResourceBundle 的安全权限运行。
参数:
参数名称 | 参数描述 |
---|---|
baseName | 资源包的基本名称,完全限定的类名 |
locale | 需要资源包的语言环境 |
返回:
给定基本名称和语言环境的资源包
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果 baseName 或 locale 为 null |
MissingResourceException | 如果找不到指定基本名称的资源包 |
public static final ResourceBundle getBundle(String baseName, Locale targetLocale, ResourceBundle.Control control)
使用指定的基本名称、目标语言环境和控件以及调用者的类加载器返回资源包。 调用该方法相当于调用
getBundle(baseName, targetLocale, this.getClass().getClassLoader(),
control),
除了 getClassLoader() 以 ResourceBundle 的安全权限运行。
参数:
参数名称 | 参数描述 |
---|---|
baseName | 资源包的基本名称,完全限定的类名 |
targetLocale | 需要资源包的语言环境 |
control | 为资源包加载过程提供信息的控件 |
返回:
给定基本名称的资源包和语言环境中的语言环境
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果 baseName、locales 或 control 为 null |
MissingResourceException | 如果在任何语言环境中都找不到指定基本名称的资源包。 |
IllegalArgumentException | 如果给定的控件没有正确执行(例如,control.getCandidateLocales 返回 null。)请注意,控件的验证是根据需要执行的。 |
public static ResourceBundle getBundle(String baseName, Locale locale, ClassLoader loader)
使用指定的基本名称、语言环境和类加载器获取资源包。
此方法的行为与调用 getBundle(java.lang.String,java.util.Locale,java.lang.ClassLoader,java.util.ResourceBundle.Control) 并传递 Control 的默认实例相同,除非 ResourceBundleControlProvider SPI 提供了另一个 Control . 参考修改默认行为的说明。
下面描述了默认行为。
getBundle 使用基本名称、指定的语言环境和默认语言环境(从 Locale.getDefault 获得)来生成一系列候选包名称。 如果指定语言环境的语言、脚本、国家和变体都是空字符串,则基本名称是唯一的候选包名称。 否则,将根据指定区域设置(语言、脚本、国家和变体)的属性值生成候选区域设置列表,并将其附加到基本名称。 通常,这将如下所示:
baseName + "_" + language + "_" + script + "_" + country + "_" + variant
baseName + "_" + language + "_" + script + "_" + country
baseName + "_" + language + "_" + script
baseName + "_" + language + "_" + country + "_" + variant
baseName + "_" + language + "_" + country
baseName + "_" + language
最后一个组件为空字符串的候选包名称以及下划线将被省略。 例如,如果 country 是一个空字符串,则上面的第二个和第五个候选捆绑包名称将被省略。 此外,如果 script 为空字符串,则省略包括 script 在内的候选名称。 例如,语言为“de”且变体为“JAVA”的语言环境将生成以下基本名称为“MyResource”的候选名称。
MyResource_de__JAVA
MyResource_de
在变体包含一个或多个下划线 ('_') 的情况下,通过截断最后一个下划线及其后面的部分生成的包名称序列将插入到具有原始变体的候选包名称之后。 例如,对于语言为“en”、脚本“Latn”、国家/地区“US”和变体“WINDOWS_VISTA”以及捆绑包基本名称“MyResource”的语言环境,将生成以下候选捆绑包名称列表:
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
注意:对于某些语言环境,候选捆绑包名称列表包含额外的名称,或者捆绑包名称的顺序略有修改。
getBundle 然后遍历候选包名称以找到第一个可以实例化实际资源包的名称。 它使用默认控件的 Control#getFormats 方法,该方法为每个生成的名称生成两个包名称,第一个是类名,第二个是属性文件名。 对于每个候选包名称,它会尝试创建一个资源包:
这一直持续到结果资源包被实例化或候选包名称列表用完为止。 如果没有找到匹配的资源包,则调用默认控件的 Control#getFallbackLocale 方法,该方法返回当前的默认语言环境。 使用此语言环境生成一个新的候选语言环境名称序列,并再次搜索,如上所述。
如果仍然没有找到结果包,则仅查找基本名称。 如果这仍然失败,则会引发 MissingResourceException。
一旦找到结果资源包,就会实例化其父链。 如果结果包已经有一个父级(可能是因为它是从缓存中返回的),则链是完整的。
否则,getBundle 会检查在生成结果资源包的过程中使用的候选语言环境列表的其余部分。 (和以前一样,最终组件为空字符串的候选包名称被省略。)当涉及到候选列表的末尾时,它会尝试纯包名称。 对于每个候选包名称,它都会尝试实例化一个资源包(首先查找一个类,然后查找一个属性文件,如上所述)。
无论何时成功,它都会使用新的资源包调用先前实例化的资源包的 setParent 方法。 这一直持续到名称列表用完或当前捆绑包已经有一个非空父级。
父链完成后,将返回捆绑包。
注意:getBundle 缓存实例化的资源包,并可能多次返回相同的资源包实例。
注意:baseName 参数应该是一个完全限定的类名。 但是,为了与早期版本兼容,Sun 的 Java SE 运行时环境不会验证这一点,因此可以通过指定路径名(使用“/”)而不是完全限定的类名(使用“.”)来访问 PropertyResourceBundles .
例子:
提供了以下类和属性文件:
MyResources.class
MyResources.properties
MyResources_fr.properties
MyResources_fr_CH.class
MyResources_fr_CH.properties
MyResources_en.properties
MyResources_es_ES.class
所有文件的内容都是有效的(即“.class”文件的 ResourceBundle 的公共非抽象子类,语法正确的“.properties”文件)。 默认语言环境是 Locale("en", "GB")。
使用以下语言环境参数调用 getBundle 将实例化资源包,如下所示:
文件 MyResources_fr_CH.properties 从未使用过,因为它被 MyResources_fr_CH.class 隐藏。 同样,MyResources.properties 也被 MyResources.class 隐藏。
参数:
参数名称 | 参数描述 |
---|---|
baseName | 资源包的基本名称,完全限定的类名 |
locale | 需要资源包的语言环境 |
loader | 加载资源包的类加载器 |
返回:
给定基本名称和语言环境的资源包
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果 baseName、locale 或 loader 为 null |
MissingResourceException | 如果找不到指定基本名称的资源包 |
public static ResourceBundle getBundle(String baseName, Locale targetLocale, ClassLoader loader, ResourceBundle.Control control)
使用指定的基本名称、目标语言环境、类加载器和控件返回资源包。 与没有 controlargument 的 getBundlefactory 方法不同,给定的控件指定如何定位和实例化资源包。 从概念上讲,具有给定控件的包加载过程在以下步骤中执行。
在上面的资源包加载过程中,这个工厂方法会在调用 Control#newBundle(String, Locale, String, ClassLoader, boolean) 方法之前查找缓存。 如果缓存中找到的资源包的生存期已经过期,工厂方法调用ResourceBundle.Control#needsReload(String, Locale, String, ClassLoader, ResourceBundle, long)方法判断资源包是否需要 要重新加载。 如果需要重新加载,工厂方法调用 control.newBundle 来重新加载资源包。 如果 control.newBundle 返回 null,工厂方法会将一个虚拟资源包放入缓存中,作为不存在资源包的标记,以避免后续请求的查找开销。 此类虚拟资源束处于与 control 指定的相同的过期控制之下。
默认情况下,所有加载的资源包都被缓存。
以下是使用默认 ResourceBundle.Control 实现的包加载过程的示例。
条件:
首先,getBundle 尝试按以下顺序加载资源包。
此时,getBundle 找到 foo/bar/Messages.properties,因为它是基本包,所以将其搁置。 getBundle 调用返回 Locale.FRENCH 的 Control#getFallbackLocale(String, Locale)。 接下来,getBundle 尝试按以下顺序加载包。
getBundle 找到 foo/bar/Messages_fr.properties 并创建一个 ResourceBundle 实例。 然后,getBundle 从候选语言环境列表中设置其父链。 在列表中仅找到 foo/bar/Messages.properties,getBundle 创建一个 ResourceBundle 实例,该实例成为 foo/bar/Messages_fr.properties 实例的父级。
参数:
参数名称 | 参数描述 |
---|---|
baseName | 资源包的基本名称,完全限定的类名 |
targetLocale | 需要资源包的语言环境 |
loader | 加载资源包的类加载器 |
control | 为资源包加载过程提供信息的控件 |
返回:
给定基本名称和语言环境的资源包
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果 baseName、targetLocale、loader 或 control 为 null |
MissingResourceException | 如果找不到指定基本名称的资源包 |
IllegalArgumentException | 如果给定的控件没有正确执行(例如,control.getCandidateLocales 返回 null。)请注意,控件的验证是根据需要执行的。 |
public static final void clearCache()
从缓存中删除所有已使用调用者的类加载器加载的资源包。
public static final void clearCache(ClassLoader loader)
从缓存中删除所有使用给定类加载器加载的资源包。
参数:
参数名称 | 参数描述 |
---|---|
loader | 类加载器 |
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果 loader 为空 |
protected abstract Object handleGetObject(String key)
从此资源包中获取给定键的对象。 如果此资源包不包含给定键的对象,则返回 null。
参数:
参数名称 | 参数描述 |
---|---|
key | 所需对象的键 |
返回:
给定键的对象,或 null
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果 key 为空 |
public abstract EnumerationString getKeys()
返回键的枚举。
返回:
此 ResourceBundle 及其父捆绑包中包含的键的枚举。
public boolean containsKey(String key)
确定给定键是否包含在此 ResourceBundle 或其父捆绑包中。
参数:
参数名称 | 参数描述 |
---|---|
key | 资源键 |
返回:
如果给定键包含在此 ResourceBundle 或其父包中,则为 true; 否则为 false。
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果 key 为空 |
public SetString keySet()
返回包含在此 ResourceBundle 及其父捆绑包中的所有键的 Set。
返回:
此 ResourceBundle 及其父捆绑包中包含的所有键的集合。
protected SetString handleKeySet()
返回仅包含在此 ResourceBundle 中的一组键。
默认实现返回由 getKeys 方法返回的一组键,除了 handleGetObject 方法返回 null 的键。 创建 Set 后,该值将保存在此 ResourceBundle 中,以避免在后续调用中生成相同的 Set。 子类可以重写此方法以加快处理速度。
返回:
仅包含在此 ResourceBundle 中的一组键
备案信息: 粤ICP备15087711号-2
Copyright © 2008-2024 啊嘎哇在线工具箱 All Rights.
本站所有资料来源于网络,版权归原作者所有,仅作学习交流使用,如不慎侵犯了您的权利,请联系我们。