public static class ResourceBundle.Control extends Object
ResourceBundle.Control定义了在捆绑包加载过程中由ResourceBundle.getBundle工厂方法调用的一组回调方法。
换句话说,ResourceBundle.Control与加载资源束的工厂方法ResourceBundle.Control工作。
回调方法的默认实现提供了工厂方法执行default behavior所需的信息 。
除了回调方法之外, toBundleName和toResourceName方法主要是为了方便实现回调方法。 但是, toBundleName方法可能会被覆盖,以在本地化资源的组织和包装中提供不同的约定。 toResourceName方法是final ,以避免使用错误的资源和类名称分隔符。
两个工厂方法, getControl(List)和getNoFallbackControl(List) ,提供ResourceBundle.Control实例,实现默认捆绑包加载过程的常见变体。
在返回的格式getFormats种通过返回的方法和候选语言环境getCandidateLocales方法必须全部一致ResourceBundle.getBundle调用了同样的基本包。 否则, ResourceBundle.getBundle方法可能返回意外的捆绑包。 例如,如果只"java.class"由返回getFormats方法第一次调用ResourceBundle.getBundle ,只"java.properties"第二次调用,则第二次调用将返回已在第一呼叫期间被缓存基于类的一个。
如果同时使用多个线程,则ResourceBundle.Control实例必须是线程安全的。 ResourceBundle.getBundle不同步调用ResourceBundle.Control方法。 这些方法的默认实现是线程安全的。
应用程序可以指定ResourceBundle.Control通过返回的情况下getControl工厂方法或从创建的子类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));
鉴于该资源包example在ResourceBundle.getBundle的描述,这ResourceBundle.getBundle呼叫负载MyResources_fr_CH.properties ,其父母为MyResources_fr.properties ,其父母为MyResources.properties 。
( MyResources_fr_CH.properties不隐藏,但是MyResources_fr_CH.class是。)
实施例2
以下是使用Properties.loadFromXML加载基于XML的软件包的示例 。
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) {
URL url = loader.getResource(resourceName);
if (url != null) {
URLConnection connection = 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() {
...
}
}
| Modifier and Type | Field and Description |
|---|---|
static List<String> |
FORMAT_CLASS
类
List包含
"java.class" 。
|
static List<String> |
FORMAT_DEFAULT
默认格式为
List ,其中包含字符串
"java.class"和
"java.properties" ,按此顺序。
|
static List<String> |
FORMAT_PROPERTIES
仅
List格式
List包含
"java.properties" 。
|
static long |
TTL_DONT_CACHE
不缓存加载的资源束实例的生存时间常数。
|
static long |
TTL_NO_EXPIRATION_CONTROL
用于禁用缓存中加载的资源束实例的到期控制的生存时间常数。
|
| Modifier | Constructor and Description |
|---|---|
protected |
Control()
唯一的构造函数。
|
| Modifier and Type | Method and Description |
|---|---|
List<Locale> |
getCandidateLocales(String baseName, Locale locale)
返回
List的
Locale作为
baseName和
locale候选语言环境。
|
static ResourceBundle.Control |
getControl(List<String> formats)
|
Locale |
getFallbackLocale(String baseName, Locale locale)
返回一个
Locale ,以作为后备区域设置,以便通过
ResourceBundle.getBundle工厂方法进一步查找资源。
|
List<String> |
getFormats(String baseName)
返回
List的
String ,其中包含用于加载给定
baseName资源束的
baseName 。
|
static ResourceBundle.Control |
getNoFallbackControl(List<String> formats)
|
long |
getTimeToLive(String baseName, Locale locale)
返回在此
ResourceBundle.Control下加载的资源束的生存时间(TTL)值。
|
boolean |
needsReload(String baseName, Locale locale, String format, ClassLoader loader, ResourceBundle bundle, long loadTime)
确定是否过期
bundle需要在缓存中根据给出的加载时间重新加载
loadTime或一些其他标准。
|
ResourceBundle |
newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
为给定格式和区域设置的给定捆绑包名称实例化资源包,如有必要,使用给定的类加载器。
|
String |
toBundleName(String baseName, Locale locale)
将给定的
baseName和
locale转换为包名称。
|
String |
toResourceName(String bundleName, String suffix)
将给定的
bundleName转换为
ClassLoader.getResource方法所需的格式,将
bundleName中所有出现的
'.'
bundleName为
'/' ,并附加
'.'和给定文件
suffix 。
|
public static final List<String> FORMAT_DEFAULT
List ,其中包含字符串"java.class"和"java.properties" ,按此顺序。
这List是unmodifiable 。
getFormats(String)
public static final List<String> FORMAT_CLASS
List包含"java.class" 。
这List是unmodifiable 。
getFormats(String)
public static final List<String> FORMAT_PROPERTIES
List格式List包含"java.properties" 。
这List是unmodifiable 。
getFormats(String)
public static final long TTL_DONT_CACHE
public static final long TTL_NO_EXPIRATION_CONTROL
public static final ResourceBundle.Control getControl(List<String> formats)
ResourceBundle.Control ,其中getFormats方法返回指定的formats 。
所述formats必须等于之一FORMAT_PROPERTIES , FORMAT_CLASS或FORMAT_DEFAULT 。
ResourceBundle.Control这个方法返回的实例是单例和线程安全的。
指定FORMAT_DEFAULT等效于实例化ResourceBundle.Control类,但该方法返回单例。
formats -
ResourceBundle.Control.getFormats方法返回的格式
ResourceBundle.Control支持指定的
formats
NullPointerException - 如果
formats是
null
IllegalArgumentException - 如果
formats未知
public static final ResourceBundle.Control getNoFallbackControl(List<String> formats)
ResourceBundle.Control其中getFormats方法返回指定formats和getFallbackLocale方法返回null 。
所述formats必须等于之一FORMAT_PROPERTIES , FORMAT_CLASS或FORMAT_DEFAULT 。
ResourceBundle.Control这个方法返回的实例是单例和线程安全的。
formats -
ResourceBundle.Control.getFormats方法返回的格式
ResourceBundle.Control支持指定的
formats没有后备
Locale支持
NullPointerException - 如果
formats是
null
IllegalArgumentException - 如果
formats未知
public List<String> getFormats(String baseName)
List的String s,其中包含用于加载给定baseName资源束的baseName 。
ResourceBundle.getBundle工厂方法尝试使用列表中指定的顺序加载格式的资源束。
此方法返回的列表必须至少有一个String 。
预定义的格式为"java.class" ,基于类的资源束, "java.properties"为properties-based 。
以"java."字符串保留用于将来的扩展,不能被应用程序定义的格式使用。
返回不可变(不可修改) List 。 但是,返回List不得它已被退回后,突变getFormats 。
默认实现返回FORMAT_DEFAULT ,以便ResourceBundle.getBundle工厂方法查找基于第一类的资源束,然后查找基于属性的资源束。
baseName - 资源包的基本名称,一个完全限定的类名
List的
String包含加载资源束的格式。
NullPointerException - 如果
baseName为空
FORMAT_DEFAULT ,
FORMAT_CLASS ,
FORMAT_PROPERTIES
public List<Locale> getCandidateLocales(String baseName, Locale locale)
List的Locale作为baseName和locale候选语言环境。
每次工厂方法尝试为目标Locale查找资源束时,这种方法由ResourceBundle.getBundle工厂方法Locale 。
候选语言环境的序列也对应于运行时资源查找路径(也称为父链 ),如果候选语言环境存在相应的资源束,并且父节点未由加载的资源束本身定义。 列表中的最后一个元素必须是root locale,如果希望将基础包作为父链的终端。
如果给定的区域设置为等于Locale.ROOT (根区域),一个List只包含根Locale必须返回。 在这种情况下, ResourceBundle.getBundle工厂方法仅加载基础包作为生成的资源束。
返回不可变(不可修改) List 。 但是,返回List不得它已被退回后,突变getCandidateLocales 。
缺省的实现返回一个List含有Locale使用下述的规则秒。 在下面的描述中, L , S , C和V分别表示非空语言,脚本,国家和变体。 例如,[ L , C ]代表一个Locale ,它只对语言和国家有非空值。 形式L (“xx”)表示(非空)语言值为“xx”。 对于所有情况, Locale其最终组件值为空字符串的Locale s。
Locale ,通过省略最终组件逐个追加候选人Locale s,如下所示:
Locale.ROOT Locale具有非空值的脚本,追加候补Locale通过省略最终成分高达语言s,则附加从所生成的候选Locale与国家和变量恢复:
Locale.ROOT Locale ,通过逐个省略变量子标记生成候选Locale s,然后在每次出现Locale s之后插入其中的原始列表中的完整变体值。 例如,如果变体由两个子标签V1和V2组成 :
Locale.ROOT Locale具有语言“zh”(中文)和空的脚本值时,可能会根据国家/地区提供“汉斯”(简体)或“汉特”(繁体)。 当国家是“CN”(中国)或“SG”(新加坡)时,提供“汉斯”。 当国家是“HK”(中国香港特别行政区)时,提供“MO”(中国澳门特别行政区)或“TW”(台湾)“Hant”。 对于所有其他国家或国家/地区为空时,不提供脚本。 例如,对于Locale("zh", "CN") ,候选人名单将是:
Locale.ROOT Locale("zh", "TW") ,候选人名单将是:
Locale.ROOT Locale("no", "NO", "NY")和Locale("nn", "NO")代表挪威尼诺斯克。 当语言环境的语言为“nn”时,标准候选列表生成最多为[ L (“nn”)],然后添加以下候选:
Locale.ROOT Locale("no", "NO", "NY") ,则首先将其转换为Locale("nn", "NO") ,然后按照上述步骤。 此外,Java将“no”语言视为NorwegianBokmÃ¥l“nb”的同义词。 除了单个案例Locale("no", "NO", "NY") (上面的处理),当输入Locale具有语言“否”或“nb”时,具有语言代码“否”和“nb”的候选人Locale s被交织,首先使用所请求的语言,然后使用其代名词。 例如, Locale("nb", "NO", "POSIX")生成以下候选列表:
Locale.ROOT Locale("no", "NO", "POSIX")将生成相同的列表,除了具有“否”的区域设置将出现在具有“nb”的相应语言环境之前。 默认实现使用一个ArrayList ,重写实现可以在将其返回给调用者之前进行修改。 但是,一个子类在getCandidateLocales返回后不能修改它。
例如,如果给定的baseName是“消息”,给定的locale是Locale("ja", "", "XX") ,那么List的Locale s:
Locale("ja", "", "XX")
Locale("ja")
Locale.ROOT
被退回
如果找到“ja”和“” Locale的资源束,则运行时资源查找路径(父链)为:
Messages_ja -> Messages
baseName - 资源包的基本名称,一个完全限定的类名
locale - 需要资源束的区域设置
List候选人
Locale s给定
locale
NullPointerException - 如果
baseName或
locale是
null
public Locale getFallbackLocale(String baseName, Locale locale)
Locale ,以作为后备区域设置,以便通过ResourceBundle.getBundle工厂方法进一步查找资源。
每次当没有为baseName和locale找到生成的资源束时,从工厂方法调用此方法,其中locale是ResourceBundle.getBundle的ResourceBundle.getBundle或此方法返回的以前的回退区域设置。
如果不需要进一步的后备搜索,该方法返回null 。
如果给定的locale不是默认的,默认实现将返回default Locale 。 否则返回null 。
baseName - 资源束的基本名称,
ResourceBundle.getBundle无法找到任何资源束的完全限定类名(基本包除外)
locale -
Locale ,其中
ResourceBundle.getBundle无法找到任何资源束(基本包除外)
Locale用于回退搜索,或
null如果没有进一步的回退搜索是期望的。
NullPointerException - 如果
baseName或
locale是
null
public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) throws IllegalAccessException, InstantiationException, IOException
null是否有可用给定参数的资源包。
如果资源束由于意外错误而无法实例化,则必须通过投掷Error或异常来报告错误,而不是简单地返回null 。
如果reload标志为true ,则表示正在调用此方法,因为先前加载的资源包已过期。
默认实现如下所示实例化一个ResourceBundle 。
toBundleName(baseName, locale)获得。 format是"java.class" ,该类由包名称指定的是通过调用加载ClassLoader.loadClass(String) 。 然后, ResourceBundle是通过调用实例化Class.newInstance() 。 请注意,在此默认实现中加载基于类的资源包时, reload标志将被忽略。 format是"java.properties" ,则调用toResourceName(bundlename, "properties")获取资源名称。 如果reload是true , load.getResource被称为获得URL创建URLConnection 。 这个URLConnection用于disable the caches的底层资源加载层,并且用于get an InputStream 。 否则, loader.getResourceAsStream被称为获得一个InputStream 。 然后, PropertyResourceBundle是用InputStream 。 format既不是"java.class"也不是"java.properties" ,则抛出一个IllegalArgumentException 。 baseName - 资源包的基础包名称,一个完全限定的类名
locale - 资源束应
locale化的区域设置
format - 要加载的资源束格式
loader - 用于加载捆绑的
ClassLoader
reload - 表示捆绑重新加载的标志;
true如果重新加载过期的资源束, false false
null如果没有找到。
NullPointerException -如果
bundleName ,
locale ,
format ,或
loader是
null ,或
null被返回
toBundleName
IllegalArgumentException - 如果
format未知,或者如果为给定参数找到的资源包含格式不正确的数据。
ClassCastException - 如果加载的类不能转换为
ResourceBundle
IllegalAccessException - 如果类或其nullary构造函数不可访问。
InstantiationException - 如果类的实例化由于某种其他原因而失败。
ExceptionInInitializerError - 如果由此方法引发的初始化失败。
SecurityException - 如果存在安全管理器,并且拒绝新实例的创建。
详见Class.newInstance() 。
IOException - 如果使用任何I / O操作读取资源时发生错误
public long getTimeToLive(String baseName, Locale locale)
ResourceBundle.Control下加载的资源束的生存时间(TTL)值。
积极的生存时间值指定捆绑可以保留在缓存中的毫秒数,而不会根据构建它的源数据进行验证。
值0表示每次从高速缓存检索时必须验证捆绑包。
TTL_DONT_CACHE指定加载的资源束不会放在缓存中。
TTL_NO_EXPIRATION_CONTROL指定将加载的资源束放在没有到期控制的高速缓存中。
通过ResourceBundle.getBundle工厂方法,该ResourceBundle.getBundle仅影响捆绑包加载过程。 也就是说,如果工厂方法在缓存中找到已经过期的资源包,那么工厂方法将调用needsReload方法来确定是否需要重新加载资源包。 如果needsReload返回true ,缓存的资源束实例将从缓存中删除。 否则,实例将保留在缓存中,并使用此方法返回的新TTL值进行更新。
由于运行时环境的内存限制,所有缓存的资源包都将从高速缓存中删除。 返回一个大的正值并不意味着在缓存中锁定加载的资源束。
默认实现返回TTL_NO_EXPIRATION_CONTROL 。
baseName - 指定到期值的资源束的基本名称。
locale - 指定到期值的资源束的区域设置。
TTL_NO_EXPIRATION_CONTROL禁用过期控制,或禁用缓存
TTL_DONT_CACHE 。
NullPointerException - 如果
baseName或
locale是
null
public boolean needsReload(String baseName, Locale locale, String format, ClassLoader loader, ResourceBundle bundle, long loadTime)
bundle需要在缓存中根据给出的加载时间重新加载loadTime或一些其他标准。
如果需要true ,该方法返回true ;
false另外。
loadTime是自Calendar Epoch以来的毫秒偏移量。
调用ResourceBundle.getBundle工厂方法在用于其当前调用的ResourceBundle.Control实例上调用此方法,而不是在最初加载资源束的调用中使用的实例。
默认实现将比较loadTime和资源束的源数据的最后修改时间。 如果自loadTime确定源数据已被修改,则返回true 。 否则返回false 。 此实现假设给定的format与其文件后缀相同,如果它不是默认格式"java.class"或"java.properties" 。
baseName - 资源束的基础包名称,一个完全限定的类名
locale - 资源束应
locale化的区域设置
format - 要加载的资源束格式
loader - 用于加载捆绑的
ClassLoader
bundle - 缓存中已过期的资源束实例
loadTime - 加载
bundle并放入缓存的时间
true如果过期的包需要重新加载;
false否则。
NullPointerException -如果
baseName ,
locale ,
format ,
loader ,或
bundle是
null
public String toBundleName(String baseName, Locale locale)
baseName和locale转换为包名称。
这种方法是从默认执行的newBundle和needsReload方法调用的。
此实现返回以下值:
baseName + "_" + language + "_" + script + "_" + country + "_" + variant
其中language , script , country和variant是语言,脚本,国家和变量值locale分别。
最后的组件值为空字符串与前面的“_”一起被省略。
当脚本为空时,脚本值将与前面的“_”一起被省略。
如果所有值都是空字符串,则返回baseName 。
例如,如果baseName是"baseName"和locale是Locale("ja", "", "XX") ,则返回"baseName_ja_ _XX" 。 如果给定的区域设置为Locale("en") ,则返回"baseName_en" 。
覆盖此方法允许应用程序在本地化资源的组织和打包中使用不同的约定。
baseName - 资源包的基本名称,一个完全限定的类名
locale - 应为其加载资源束的区域设置
NullPointerException - 如果
baseName或
locale是
null
public final String toResourceName(String bundleName, String suffix)
bundleName转换为ClassLoader.getResource方法所需的格式,将bundleName中所有出现的'.' bundleName为'/' ,并附加'.'和给定文件suffix 。
例如,如果bundleName是"foo.bar.MyResources_ja_JP"和suffix是"properties" ,则返回"foo/bar/MyResources_ja_JP.properties" 。
bundleName - 包名称
suffix - 文件类型后缀
NullPointerException - 如果
bundleName或
suffix是
null
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.