看看示例代码是怎样通过定制 Control 子类来指定 locale 包名
class SubdirControl extends Control {
//仅搜索 properties 格式的文件
public List<String> getFormats() {
return Control.FORMAT_PROPERTIES;
}
public String toBundleName(String bundleName, Locale locale) {
StringBuffer localizedBundle = new StringBuffer();
// Find the base bundle name.
int nBaseName = bundleName.lastIndexOf('.');
String baseName = bundleName;
// Create a new name starting with the package name.
if (nBaseName >= 0) {
localizedBundle.append(bundleName.substring(0, nBaseName));
baseName = bundleName.substring(nBaseName+1);
}
String strLocale = locale.toString();
// Now append the locale identification to the package name.
if (strLocale.length() > 0 ) {
localizedBundle.append("." + strLocale);
} else {
localizedBundle.append(".root");
}
// Now append the basename to the fully qualified package.
localizedBundle.append("." + baseName);
return localizedBundle.toString();
}
}
下面的代码演示了如何来调用上面子定义的 getBundle 方法:
String bundleName = "com.sun.demo.intl.res.Warnings";
SubdirControl control = new SubdirControl();
Locale locale = new Locale("fr", "FR");
ResourceBundle bundle = ResourceBundle.getBundle(bundleName, locale, control);
假如缺省的 locale 是 en_US ,那么 getBundle 方法就用 Control 类去搜索侯选项并返回
如下列出的那些包名
com.sun.demo.intl.res.fr_FR.Warnings
com.sun.demo.intl.res.fr.Warnings
com.sun.demo.intl.res.en_US.Warnings
com.sun.demo.intl.res.en.Warnings
com.sun.demo.intl.res.root.Warnings
缓存 Control 对象的实例
--------------------------
装载资源绑定的时候,默认地就会对每个“绑定”检查,判断它是否已经被装载过。我们也可以对此方式作点改变。假如,想在加载一个绑定前,简单地清除掉缓存,可以调用 ResourceBundle类的 clearCache 方法来实现。
ResourceBundle.clearCache();
ResourceBundle myBundle = ResourceBundle.getBundle("com.sun.demo.intl.res.Warnings");
甚至能为缓存设置一个“过期”数值来控制缓存的“生存周期”。在 Control 的子类里覆盖方法getTimeToLive ,这个方法返回以毫秒值代表的“生命周期”。缺省情况下,这个方法返回的是预定义的两个值中的一个,这两个值是:TTL_DONT_CACHE 和 TTL_NO_EXPIRATION_CONTROL
Control 缺省情况时返回 TTL_NO_EXPIRATION_CONTROL,这个值表示:缓存永不过期。而 TTL_DONT_CACHE 表示:根本就不对绑定进行缓存。假如,想让“绑定”每过4个小时就要进行更新,而且不是重新启动程序的话,那么需要像如下代码那样来覆盖 getTimeToLive 方法:
public long getTimeToLive() {
return 4L*60*60*1000; // 14,400,000 milliseconds is four hours.
}
Control 对象里有很多方法来为绑定的搜索和控制进行细致地设置。本文仅列举了其中的一些,其他的,如下所列的方法也可通过覆盖来实现定制:
* getCandidateLocales
* getFallbackLocale
* newBundle
* needsReload
请参阅详细的文档中对这些方法的说明(http://java.sun.com/javase/6/docs/api/java/util/ResourceBundle.Control.html)
查看本文来源