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