类 ResourceBundle.Control
java.lang.Object
java.util.ResourceBundle.Control
正在封闭类:
ResourceBundle
public static class ResourceBundle.Control extends ObjectResourceBundle.Control 定义一个回调方法集,它在包加载进程中由 ResourceBundle.getBundle 工厂方法调用。
换句话说,ResourceBundle.Control 与工厂方法协作可用于加载资源包。回调方法的默认实现为工厂方法提供执行默认行为的必要信息。
除了回调方法外,还定义了 toBundleName 和 toResourceName 方法,其主要目的是为实现回调方法提供方便。
但是,若要在本地化资源的组织和打包中提供不同的约定,也可以重写 toBundleName 方法。toResourceName 方法是 final 方法,以避免使用错误的资源和类名称分隔符。
两个工厂方法 getControl(List) 和 getNoFallbackControl(List) 都提供 ResourceBundle.Control 实例,这些实例实现默认包加载进程的常见变量。
在相同基本包的所有 ResourceBundle.getBundle 调用中,getFormats 方法返回的格式和 getCandidateLocales 方法返回的候选语言环境必须一致。
例如,如果 getFormats 方法在
第一次调用 ResourceBundle.getBundle 时只返回 "java.class",
第二次调用时只返回 "java.properties",
那么第二次调用返回的基于类的包将是在第一次调用过程中缓存的那个包。
如果 ResourceBundle.Control 实例被多个线程同时使用,则它必须是线程安全的。
ResourceBundle.getBundle 不会同时调用 ResourceBundle.Control 方法。方法的默认实现是线程安全的。
应用程序可以指定 getControl 工厂方法返回的 ResourceBundle.Control 实例,
也可以指定从 ResourceBundle.Control 子类创建的 ResourceBundle.Control 实例,
以自定义包加载进程。下面是对默认包加载进程进行更改的示例。
示例 1
以下代码让 ResourceBundle.getBundle 只查找基于属性的资源。
import java.util.*;
import static java.util.ResourceBundle.Control.*;
...
ResourceBundle bundle =
ResourceBundle.getBundle("MyResources", new Locale("fr", "CH"),
ResourceBundle.Control.getControl(FORMAT_PROPERTIES));
给定 ResourceBundle.getBundle 描述的示例中的资源包,
此 ResourceBundle.getBundle 调用加载 MyResources_fr_CH.properties,
它的父属性是 MyResources_fr.properties,
而后者的父属性是 MyResources.properties。(没有隐藏 MyResources_fr_CH.properties,但隐藏了 MyResources_fr_CH.class。)
示例 2 :
package com.itm.ResourceBundle; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.net.URLConnection; import java.util.Arrays; import java.util.Enumeration; import java.util.List; import java.util.Locale; import java.util.Properties; import java.util.ResourceBundle; /****** JDK : 使用 Properties.loadFromXML 加载基于 XML 的包的示例。 */ public class TwoXMLResourceBundle { ResourceBundle rb = ResourceBundle.getBundle("Messages", new ResourceBundle.Control() { public List<String> getFormats(String baseName) { if (baseName == null) throw new NullPointerException(); return Arrays.asList("xml"); } public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) throws IllegalAccessException, InstantiationException, IOException { if (baseName == null || locale == null || format == null || loader == null) throw new NullPointerException(); ResourceBundle bundle = null; if (format.equals("xml")) { String bundleName = toBundleName(baseName, locale); String resourceName = toResourceName(bundleName, format); InputStream stream = null; if (reload) { Serializable url = loader.getResource(resourceName); if (url != null) { URLConnection connection = ((java.net.URL) url) .openConnection(); if (connection != null) { // Disable caches to get fresh data for // reloading. connection.setUseCaches(false); stream = connection.getInputStream(); } } } else { stream = loader.getResourceAsStream(resourceName); } if (stream != null) { BufferedInputStream bis = new BufferedInputStream( stream); bundle = new XMLResourceBundle(bis); bis.close(); } } return bundle; } }); // ... private static class XMLResourceBundle extends ResourceBundle { private Properties props; XMLResourceBundle(InputStream stream) throws IOException { props = new Properties(); props.loadFromXML(stream); } protected Object handleGetObject(String key) { return props.getProperty(key); } public Enumeration<String> getKeys() { return null; // ... } } }
以下转帖:http://blog.csdn.net/shanliangliuxing/article/details/6827972
一、认识国际化资源文件
这个类提供软件国际化的捷径。通过此类,可以使您所编写的程序可以:
轻松地本地化或翻译成不同的语言
一次处理多个语言环境
以后可以轻松地进行修改,支持更多的语言环境
说的简单点,这个类的作用就是读取资源属性文件(properties),然后根据 .properties文件 的名称信息(本地化信息),匹配当前系统的国别语言信息(也可以程序指定),然后获取相应的properties文件的内容。
使用这个类,要注意的一点是,这个properties文件的名字是有规范的:
一般的命名规范是: 自定义名_语言代码_国别代码.properties,
如果是默认的,直接写为:自定义名.properties
比如:
myres_en_US.properties
myres_zh_CN.properties
myres.properties
当在中文操作系统下,如果myres_zh_CN.properties、myres.properties两个文件都存在,则优先会使用myres_zh_CN.properties,
当myres_zh_CN.properties不存在时候,会使用默认的myres.properties。
没有提供语言和地区的资源文件是系统默认的资源文件。
资源文件都必须是ISO-8859-1编码,因此,对于所有非西方语系的处理,都必须先将之转换为Java Unicode Escape格式。转换方法是通过JDK自带的工具native2ascii.
二、实例
定义三个资源文件,放到src的根目录下面(必须这样,或者你放到自己配置的calsspath下面。
myres.properties
aaa=good
bbb=thanks
myres_en_US.properties
aaa=good
bbb=thanks
myres_zh_CN.properties
aaa=\u597d
bbb=\u591a\u8c22
打印:
好
好
good