自定义资源包加载
在本类的前面,您学习了如何创建和访问ResourceBundle
类的对象。本节将扩展您的知识,并说明如何利用ResourceBundle.Control类功能。
创建ResourceBundle.Control
是为了指定如何定位和实例化资源束。它定义了一组回调方法,这些方法在 Binding 包加载过程中由ResourceBundle.getBundle工厂方法调用。
与前面介绍的ResourceBundle.getBundle方法不同,此ResourceBundle.getBundle
方法使用指定的基本名称,默认语言环境和指定的控件定义资源束。
public static final ResourceBundle getBundle(
String baseName,
ResourceBundle.Control cont
// ...
指定的控件为资源包加载过程提供信息。
以下名为RBControl.java的示例程序说明了如何为中文语言环境定义自己的搜索路径。
1.创建属性文件。
如前所述,您可以从类或properties
文件中加载资源。这些文件包含以下语言环境的描述:
-
RBControl.properties
–Global -
RBControl_zh.properties
–仅语言:简体中文 -
RBControl_zh_cn.properties
–仅地区:中国 -
RBControl_zh_hk.properties
–仅限地区:香港 -
RBControl_zh_tw.properties
–台湾
在此示例中,应用程序为香港地区创建了一个新的语言环境。
2.创建一个 ResourceBundle 实例。
如上一节中的示例所示,此应用程序通过调用getBundle
方法来创建ResourceBundle
实例:
private static void test(Locale locale) {
ResourceBundle rb = ResourceBundle.getBundle(
"RBControl",
locale,
new ResourceBundle.Control() {
// ...
}
);
getBundle
方法搜索带有 RBControl 前缀的properties
文件。但是,此方法包含一个Control
参数,该参数驱动搜索中文区域设置的过程。
3.调用 getCandidateLocales 方法
getCandidateLocales
方法返回Locales
对象的列表,作为基本名称和语言环境的候选语言环境。
new ResourceBundle.Control() {
@Override
public List<Locale> getCandidateLocales(
String baseName,
Locale locale) {
// ...
}
}
默认实现返回Locale
对象的列表,如下所示:语言环境(语言,国家/地区)。
但是,将重写此方法以实现以下特定行为:
if (baseName == null)
throw new NullPointerException();
if (locale.equals(new Locale("zh", "HK"))) {
return Arrays.asList(
locale,
Locale.TAIWAN,
// no Locale.CHINESE here
Locale.ROOT);
} else if (locale.equals(Locale.TAIWAN)) {
return Arrays.asList(
locale,
// no Locale.CHINESE here
Locale.ROOT);
}
请注意,候选语言环境序列的最后一个元素必须是根语言环境。
4.致电测试班
为以下四个不同的语言环境调用test
类:
public static void main(String[] args) {
test(Locale.CHINA);
test(new Locale("zh", "HK"));
test(Locale.TAIWAN);
test(Locale.CANADA);
}
5.运行示例程序
您将看到程序输出,如下所示:
locale: zh_CN
region: China
language: Simplified Chinese
locale: zh_HK
region: Hong Kong
language: Traditional Chinese
locale: zh_TW
region: Taiwan
language: Traditional Chinese
locale: en_CA
region: global
language: English
请注意,新创建的文件已分配给香港地区,因为它是在适当的properties
文件中指定的。繁体中文被指定为台湾地区的语言。
RBControl
示例中未使用ResourceBundle.Control
类的其他两个有趣的方法,但值得一提。 getTimeToLive
方法用于确定资源束在缓存中可以存在多 Long 时间。如果针对高速缓存中资源束的时间限制已到期,则调用needsReload
方法以确定是否需要重新加载资源束。