- java.lang.Object
-
- java.util.ResourceBundle.Control
-
- Enclosing class:
- ResourceBundle
public static class ResourceBundle.Control extends Object
ResourceBundle.Control
定义了一组回调方法,这些方法在捆绑加载过程中由ResourceBundle.getBundle
工厂方法调用。 换句话说,ResourceBundle.Control
与工厂方法协作以加载资源包。 回调方法的默认实现提供了工厂方法执行default behavior所需的信息。ResourceBundle.Control
专为部署在未命名模块中的应用程序而设计,例如,支持非标准格式的资源包或以非传统约定打包本地化资源。ResourceBundleProvider
是更换为ResourceBundle.Control
迁移到模块时。UnsupportedOperationException
采用ResourceBundle.Control
参数的工厂方法时,将抛出ResourceBundle.Control
。除了回调方法之外,
toBundleName
和toResourceName
方法的定义主要是为了方便实现回调方法。 但是,可以重写toBundleName
方法,以在组织和本地化资源的打包中提供不同的约定。toResourceName
方法是final
以避免使用错误的资源和类名分隔符。两种工厂方法
getControl(List)
和getNoFallbackControl(List)
提供ResourceBundle.Control
实例,ResourceBundle.Control
实例实现默认捆绑加载过程的常见变体。在返回的格式
getFormats
种通过返回的方法和候选语言环境getCandidateLocales
方法必须全部一致ResourceBundle.getBundle
调用了同样的基本包。 否则,ResourceBundle.getBundle
方法可能会返回非预期的包。 例如,如果getFormats
方法仅为第一次呼叫"java.class"
返回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));
鉴于ResourceBundle.getBundle
描述中example中的资源包,此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() { ... } }
- API Note:
-
命名模块不支持
ResourceBundle.Control
。 如果在命名模块中调用ResourceBundle.getBundle
方法和ResourceBundle.Control
,则该方法将抛出UnsupportedOperationException
。 在命名模块中将忽略ResourceBundleControlProvider
的任何服务提供者。 - 从以下版本开始:
- 1.6
- 另请参见:
-
ResourceBundleProvider
-
-
字段汇总
字段 变量和类型 字段 描述 static List<String>
FORMAT_CLASS
仅限类的格式List
包含"java.class"
。static List<String>
FORMAT_DEFAULT
默认格式List
,按此顺序包含字符串"java.class"
和"java.properties"
。static List<String>
FORMAT_PROPERTIES
仅限属性List
包含"java.properties"
。static long
TTL_DONT_CACHE
不缓存已加载资源包实例的生存时间常量。static long
TTL_NO_EXPIRATION_CONTROL
生存时间常量,用于禁用缓存中已加载资源包实例的到期控制。
-
构造方法摘要
构造方法 变量 构造器 描述 protected
Control()
唯一的构造函数。
-
方法摘要
所有方法 静态方法 实例方法 具体的方法 变量和类型 方法 描述 List<Locale>
getCandidateLocales(String baseName, Locale locale)
返回List
的Locale
s作为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
s,其中包含用于加载给定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)
确定是否需要根据loadTime
或其他一些条件给出的加载时间重新加载缓存中已过期的bundle
。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
所有出现次数替换为'/'
并附加'.'
和给定文件suffix
,将给定的bundleName
转换为ClassLoader.getResource
方法所需的suffix
。
-
-
-
字段详细信息
-
FORMAT_DEFAULT
public static final List<String> FORMAT_DEFAULT
默认格式List
,按此顺序包含字符串"java.class"
和"java.properties"
。List
不可修改。- 另请参见:
-
getFormats(String)
-
FORMAT_CLASS
public static final List<String> FORMAT_CLASS
仅限类的格式List
包含"java.class"
。List
不可修改。- 另请参见:
-
getFormats(String)
-
FORMAT_PROPERTIES
public static final List<String> FORMAT_PROPERTIES
仅限属性List
包含"java.properties"
。List
不可修改。- 另请参见:
-
getFormats(String)
-
TTL_DONT_CACHE
public static final long TTL_DONT_CACHE
不缓存已加载资源包实例的生存时间常量。- 另请参见:
-
getTimeToLive(String, Locale)
, 常数字段值
-
TTL_NO_EXPIRATION_CONTROL
public static final long TTL_NO_EXPIRATION_CONTROL
生存时间常量,用于禁用缓存中已加载资源包实例的到期控制。- 另请参见:
-
getTimeToLive(String, Locale)
, 常数字段值
-
-
方法详细信息
-
getControl
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
方法返回的格式 - 结果
-
a
ResourceBundle.Control
支持指定的formats
- 异常
-
NullPointerException
- 如果formats
是null
-
IllegalArgumentException
- 如果formats
未知
-
getNoFallbackControl
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
方法返回的格式 - 结果
-
a
ResourceBundle.Control
支持指定formats
,无后退Locale
支持 - 异常
-
NullPointerException
- 如果formats
是null
-
IllegalArgumentException
- 如果formats
不明
-
getFormats
public List<String> getFormats(String baseName)
返回List
的String
s,其中包含用于加载给定baseName
资源包的baseName
。ResourceBundle.getBundle
工厂方法尝试按照列表指定的顺序加载格式的资源包。 此方法返回的列表必须至少有一个String
。 预定义的格式是"java.class"
对于基于类的资源包和"java.properties"
为properties-based分的。 以"java."
开头的字符串保留用于将来的扩展,不得由应用程序定义的格式使用。不要求返回不可变(不可修改)
List
。 但是,返回的List
在List
返回后getFormats
。默认实现返回
FORMAT_DEFAULT
,以便ResourceBundle.getBundle
工厂方法查找基于类的基于资源的包,然后查找基于属性的资源包。- 参数
-
baseName
- 资源包的基本名称,完全限定的类名 - 结果
-
List
的String
其中包含用于加载资源包的格式。 - 异常
-
NullPointerException
- 如果baseName
为空 - 另请参见:
-
FORMAT_DEFAULT
,FORMAT_CLASS
,FORMAT_PROPERTIES
-
getCandidateLocales
public List<Locale> getCandidateLocales(String baseName, Locale locale)
返回List
的Locale
s作为baseName
和locale
候选语言环境。 每次工厂方法尝试为目标Locale
查找资源束时,ResourceBundle.getBundle
工厂方法都会调用此方法。如果候选语言环境的相应资源包存在且其父项未由加载的资源包本身定义,则候选语言环境的序列也对应于运行时资源查找路径(也称为父链 )。 如果希望将基本包作为父链的终端,则列表的最后一个元素必须是root locale 。
如果给定的区域设置为等于
Locale.ROOT
(根区域),一个List
只包含根Locale
必须返回。 在这种情况下,ResourceBundle.getBundle
工厂方法仅将基础包加载为生成的资源包。不要求返回不可变(不可修改)
List
。 但是,返回的List
在List
返回后getCandidateLocales
。缺省的实现返回一个
List
含有Locale
使用下述的规则秒。 在下面的描述中, L , S , C和V分别表示非空语言,脚本,国家和变体。 例如,[ L , C ]表示Locale
,其仅具有语言和国家/地区的非空值。 形式L (“xx”)表示(非空)语言值是“xx”。 对于所有情况,Locale
最终组件值为空字符串的Locale
。- 对于具有空脚本值的输入
Locale
,通过逐个省略最终组件来附加候选Locale
,如下所示:- [ L , C , V ]
- [ L , C ]
- [ L ]
-
Locale.ROOT
- 对于具有非空脚本值的输入
Locale
,通过省略语言的最终组件来附加候选Locale
,然后附加从Locale
生成的Locale
国家和变体:- [ L , S , C , V ]
- [ L , S , C ]
- [ L , S ]
- [ L , C , V ]
- [ L , C ]
- [ L ]
-
Locale.ROOT
- 对于具有由下划线分隔的多个子标签组成的变体值的输入
Locale
,通过逐个省略变体子标签生成候选Locale
,然后在每次出现Locale
之后插入它们,并在原始列表中使用完整变量值。 例如,如果变体由两个子标签V1和V2组成 :- [ L , S , C , V1 , V2 ]
- [ L , S , C , V1 ]
- [ L , S , C ]
- [ L , S ]
- [ L , C , V1 , V2 ]
- [ L , C , V1 ]
- [ L , C ]
- [ L ]
-
Locale.ROOT
- 中国特例。 当输入
Locale
具有语言“zh”(中文)和空脚本值时,可能会提供“Hans”(简体)或“Hant”(繁体),具体取决于国家/地区。 当国家是“CN”(中国)或“SG”(新加坡)时,提供“汉斯”。 当国家为“香港”(中国香港特别行政区),“MO”(澳门特别行政区中国)或“TW”(台湾)时,提供“Hant”。 对于所有其他国家/地区或国家/地区为空时,不提供脚本。 例如,对于Locale("zh", "CN")
,候选列表将是:- [ L (“zh”), S (“Hans”), C (“CN”)]
- [ L (“zh”), S (“Hans”)]
- [ L (“zh”), C (“CN”)]
- [ L (“zh”)]
-
Locale.ROOT
Locale("zh", "TW")
,候选人名单将是:- [ L (“zh”), S (“Hant”), C (“TW”)]
- [ L (“zh”), S (“Hant”)]
- [ L (“zh”), C (“TW”)]
- [ L (“zh”)]
-
Locale.ROOT
- 挪威语的特例。
Locale("no", "NO", "NY")
和Locale("nn", "NO")
代表挪威尼诺斯克。 当语言环境的语言为“nn”时,标准候选列表最多生成[ L (“nn”)],然后添加以下候选项:- [ L (“no”), C (“NO”), V (“NY”)]
- [ L (“否”), C (“否”)]
- [ L (“否”)]
-
Locale.ROOT
Locale("no", "NO", "NY")
,则首先将其转换为Locale("nn", "NO")
,然后执行上述过程。此外,Java将语言“no”视为NorwegianBokmÃ¥l“nb”的同义词。 除了单个案例
Locale("no", "NO", "NY")
(上面已处理),当输入Locale
具有语言“no”或“nb”时,具有语言代码“no”和“nb”的候选Locale
是交错的,首先使用所请求的语言,然后使用其代名词。 例如,Locale("nb", "NO", "POSIX")
生成以下候选列表:- [ L (“nb”), C (“NO”), V (“POSIX”)]
- [ L (“no”), C (“NO”), V (“POSIX”)]
- [ L (“nb”), C (“否”)]
- [ L (“否”), C (“否”)]
- [ L (“nb”)]
- [ L (“否”)]
-
Locale.ROOT
Locale("no", "NO", "POSIX")
将生成相同的列表,除了带有“no”的语言环境将出现在具有“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
求locale
- 异常
-
NullPointerException
- 如果baseName
或locale
是null
- 对于具有空脚本值的输入
-
getFallbackLocale
public Locale getFallbackLocale(String baseName, Locale locale)
返回Locale
,以用作ResourceBundle.getBundle
工厂方法进一步搜索资源包的后备区域设置。 每次没有找到baseName
和locale
结果资源包时,将从工厂方法调用此方法,其中locale是ResourceBundle.getBundle
的参数或此方法返回的先前回退区域设置。如果不需要进一步的回退搜索,则该方法返回
null
。如果给定的
locale
不是默认值,则默认实现返回defaultLocale
。 否则,返回null
。- 参数
-
baseName
- 资源包的基本名称,ResourceBundle.getBundle
无法找到任何资源包的完全限定类名(基本包除外) -
locale
-Locale
,其中ResourceBundle.getBundle
无法找到任何资源束(基本捆绑包除外) - 结果
-
一个
Locale
用于回退搜索,或null
如果没有进一步的回退搜索是期望的。 - 异常
-
NullPointerException
- 如果baseName
或locale
是null
-
newBundle
public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) throws IllegalAccessException, InstantiationException, IOException
如果需要,使用给定的类加载器为给定格式和语言环境的给定包名称实例化资源包。 如果没有可用于给定参数的资源束,则此方法返回null
。 如果由于意外错误而无法实例化资源包,则必须通过抛出Error
或异常
来报告错误,而不是简单地返回null
。如果
reload
标志为true
,则表示正在调用此方法,因为先前加载的资源包已过期。- 实现要求:
-
命名模块中的资源包受
Module.getResourceAsStream
指定的封装规则的约束 。 当无条件打开与资源包对应的资源文件的包时,可以访问给定类加载器可见的命名模块中的资源包。默认实现如下所示实例化
ResourceBundle
。- 通过调用
toBundleName(baseName, locale)
获得包名称。 - 如果
format
是"java.class"
,则由包名称指定的类
将加载给定的类加载器。 如果类
被发现,然后访问该ResourceBundle
被实例化。 如果bundle类文件的包无条件打开,则可以访问资源包; 否则,将抛出IllegalAccessException
。 请注意,在此默认实现中,将忽略reload
标志以加载基于类的资源包。 - 如果
format
是"java.properties"
,则调用toResourceName(bundlename, "properties")
以获取资源名称。 如果reload
是true
,则调用load.getResource
以获得URL
以创建URLConnection
。URLConnection
用于disable the caches的底层资源加载层,以及get anInputStream
。 否则, 调用loader.getResourceAsStream
获取InputStream
。 然后,使用InputStream构建InputStream
。 - 如果
format
既不是"java.class"
也不是"java.properties"
,则抛出IllegalArgumentException
。
- 通过调用
- 参数
-
baseName
- 资源包的基本包名称,完全限定的类名 -
locale
- 应为其实例化资源包的语言环境 -
format
- 要加载的资源包格式 -
loader
- 用于加载捆绑包的ClassLoader
-
reload
- 表示捆绑重新加载的标志;true
如果重新加载过期的资源包,false
- 结果
-
资源包实例,如果找不到,
null
。 - 异常
-
NullPointerException
-如果bundleName
,locale
,format
,或loader
为null
,或者如果null
被返回toBundleName
-
IllegalArgumentException
- 如果format
未知,或者找到给定参数的资源包含格式错误的数据。 -
ClassCastException
- 如果加载的类无法ResourceBundle
为ResourceBundle
-
IllegalAccessException
- 如果无法访问类或其无效构造函数。 -
InstantiationException
- 如果某个类的实例化因某些其他原因而失败。 -
ExceptionInInitializerError
- 如果此方法引发的初始化失败。 -
SecurityException
- 如果存在安全管理器并且拒绝创建新实例。 有关详细信息,请参阅Class.newInstance()
。 -
IOException
- 如果使用任何I / O操作读取资源时发生错误 - 另请参见:
-
ResourceBundleProvider.getBundle(String, Locale)
-
getTimeToLive
public long getTimeToLive(String baseName, Locale locale)
返回在此ResourceBundle.Control
下加载的资源包的生存时间(TTL)值。 正生存时间值指定捆绑包可以保留在缓存中的毫秒数,而不会根据构造它的源数据进行验证。 值0表示每次从缓存中检索包时都必须验证该包。TTL_DONT_CACHE
指定已加载的资源包未放入缓存中。TTL_NO_EXPIRATION_CONTROL
指定将已加载的资源包放入缓存中,但没有到期控制。到期仅影响
ResourceBundle.getBundle
工厂方法的捆绑加载过程。 也就是说,如果工厂方法在缓存中找到已过期的资源束,则工厂方法调用needsReload
方法以确定是否需要重新加载资源束。 如果needsReload
返回true
,则会从缓存中删除缓存的资源包实例。 否则,实例将保留在缓存中,并使用此方法返回的新TTL值进行更新。由于运行时环境的内存限制,所有缓存的资源包都将从缓存中删除。 返回大的正值并不意味着将加载的资源包锁定在缓存中。
默认实现返回
TTL_NO_EXPIRATION_CONTROL
。- 参数
-
baseName
- 为其指定过期值的资源束的基本名称。 -
locale
- 指定了到期值的资源包的区域设置。 - 结果
-
缓存时间(0或从缓存时间的正毫秒偏移量)到缓存中已加载的包已过期,
TTL_NO_EXPIRATION_CONTROL
用于禁用过期控制,或TTL_DONT_CACHE
用于禁用缓存。 - 异常
-
NullPointerException
- 如果baseName
或locale
是null
-
needsReload
public boolean needsReload(String baseName, Locale locale, String format, ClassLoader loader, ResourceBundle bundle, long loadTime)
确定是否需要根据loadTime
或其他一些条件给出的加载时间重新加载缓存中已过期的bundle
。 如果需要重新加载,该方法返回true
; 否则为false
。loadTime
是自Calendar
Epoch以来的毫秒偏移量。调用
ResourceBundle.getBundle
工厂方法在用于其当前调用的ResourceBundle.Control
实例上调用此方法,而不是在最初加载资源束的调用中使用的实例上调用此方法。默认实现比较
loadTime
以及资源束的源数据的上次修改时间。 如果确定源数据自loadTime
以来已被修改,则返回true
。 否则,返回false
。 此实现假定给定的format
与其文件后缀是相同的字符串,如果它不是默认格式之一,"java.class"
或"java.properties"
。- 参数
-
baseName
- 资源包的基本包名称,完全限定的类名 -
locale
- 应为其实例化资源包的语言环境 -
format
- 要加载的资源包格式 -
loader
- 用于加载捆绑包的ClassLoader
-
bundle
- 已在缓存中过期的资源包实例 -
loadTime
-bundle
已加载并放入缓存的时间 - 结果
-
true
如果需要重新加载过期的包; 否则为false
。 - 异常
-
NullPointerException
-如果baseName
,locale
,format
,loader
,或bundle
为null
-
toBundleName
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
- 另请参见:
-
AbstractResourceBundleProvider.toBundleName(String, Locale)
-
toResourceName
public final String toResourceName(String bundleName, String suffix)
通过将'.'
中bundleName
所有出现次数替换为'/'
并附加'.'
和给定文件suffix
,将给定的bundleName
转换为ClassLoader.getResource
方法所需的suffix
。 例如,如果bundleName
是"foo.bar.MyResources_ja_JP"
而suffix
是"properties"
,则返回"foo/bar/MyResources_ja_JP.properties"
。- 参数
-
bundleName
- 捆绑包名称 -
suffix
- 文件类型后缀 - 结果
- 转换后的资源名称
- 异常
-
NullPointerException
- 如果bundleName
或suffix
是null
-
-