这些Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本引入的改进,并且可能使用不再可用的技术。
请参阅Java语言更改,了解Java SE 9及后续版本中更新的语言特性的摘要。
请参阅JDK发行说明,了解有关所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息。
在本课程的前面部分,您已经学会了如何创建和访问ResourceBundle类的对象。本节将扩展您的知识,并解释如何利用ResourceBundle.Control类的功能。
ResourceBundle.Control是用于指定如何定位和实例化资源包的。它定义了一组回调方法,在资源包加载过程中由ResourceBundle.getBundle工厂方法调用。
与之前描述的ResourceBundle.getBundle方法不同,这个ResourceBundle.getBundle方法使用指定的基本名称、默认区域设置和指定的控制来定义资源包。
public static final ResourceBundle getBundle(
String baseName,
ResourceBundle.Control cont
// ...
指定的控制提供了资源包加载过程的信息。
下面的示例程序名为RBControl.java,演示了如何为中文区域设置定义自己的搜索路径。
properties文件。如前所述,您可以从类或properties文件中加载资源。这些文件包含以下区域设置的描述:
RBControl.properties – 全球 RBControl_zh.properties – 仅语言:简体中文 RBControl_zh_CN.properties – 仅地区:中国 RBControl_zh_HK.properties – 仅地区:香港 RBControl_zh_TW.properties – 台湾在这个例子中,一个应用程序为香港地区创建了一个新的语言环境。
ResourceBundle实例。与上一节的示例一样,这个应用程序通过调用getBundle方法创建了一个ResourceBundle实例:
private static void test(Locale locale) {
ResourceBundle rb = ResourceBundle.getBundle(
"RBControl",
locale,
new ResourceBundle.Control() {
// ...
}
);
getBundle方法会搜索以RBControl为前缀的properties文件。然而,这个方法包含一个Control参数,用于驱动搜索中文语言环境的过程。
getCandidateLocales方法getCandidateLocales方法返回一个候选的Locales对象列表,作为基本名称和语言环境的候选语言环境。
new ResourceBundle.Control() {
@Override
public List<Locale> getCandidateLocales(
String baseName,
Locale locale) {
// ...
}
}
默认实现返回一个Locale对象列表,格式为:Locale(语言, 国家)。
然而,这个方法被重写以实现以下特定行为:
if (baseName == null)
throw new NullPointerException();
if (locale.equals(new Locale("zh", "HK"))) {
return Arrays.asList(
locale,
Locale.TAIWAN,
// 这里没有 Locale.CHINESE
Locale.ROOT);
} else if (locale.equals(Locale.TAIWAN)) {
return Arrays.asList(
locale,
// 这里没有 Locale.CHINESE
Locale.ROOT);
}
注意,候选语言环境序列的最后一个元素必须是根语言环境。
test类为以下四种不同的语言环境调用test类:
public static void main(String[] args) {
test(Locale.CHINA);
test(new Locale("zh", "HK"));
test(Locale.TAIWAN);
test(Locale.CANADA);
}
您将看到以下程序输出:
locale: zh_CN
region: China
language: 简体中文
locale: zh_HK
region: Hong Kong
language: 繁体中文
locale: zh_TW
region: Taiwan
language: 繁体中文
locale: en_CA
region: global
language: 英文
请注意,新创建的语言环境被分配为香港地区,因为它在适当的properties文件中指定。台湾语言环境的语言被分配为繁体中文。
ResourceBundle.Control类的另外两个有趣的方法在RBControl示例中没有被使用,但值得一提。 getTimeToLive方法用于确定资源包可以在缓存中存在多长时间。 如果缓存中的资源包的时间限制已经过期,将调用needsReload方法来确定是否需要重新加载资源包。