public abstract class ResourceBundle extends Object
String
,您的程序可以从适合当前用户的区域设置的资源包中加载它。
以这种方式,您可以编写程序代码,这个程序代码大部分独立于用户的区域设置,以隔离资源束中大部分(如果不是全部)特定于区域设置的信息。
这样就可以编写程序:
资源束属于其成员共享公共基本名称但其名称还具有标识其区域设置的其他组件的家族。 例如,一系列资源束的基本名称可能是“MyResources”。 家庭应该有一个默认的资源包,它与其家族名称 - “MyResources”完全相同 - 如果不支持特定的区域设置,将会被用作最后的包。 然后,家族可以根据需要提供尽可能多的特定于区域的成员,例如名为“MyResources_de”的德语。
一个系列中的每个资源包都包含相同的项目,但这些项目已被翻译成由该资源包所表示的区域设置。 例如,无论是“为MyResources”和“MyResources_de”中可能有一个String
这里使用了一个按钮,用于取消操作。 在“MyResources”中, String
可能包含“取消”,在“MyResources_de”中可能包含“Abbrechen”。
如果不同国家有不同的资源,您可以进行专业化:例如,“MyResources_de_CH”包含瑞士(CH)中德语(de)的对象。 如果您只想修改专业化中的一些资源,可以这样做。
当您的程序需要特定于语言环境的对象时,它将使用getBundle
方法加载ResourceBundle
类:
ResourceBundle myResources = ResourceBundle.getBundle("MyResources", currentLocale);
资源束包含键/值对。 密钥唯一标识包中特定于区域的对象。 以下是包含两个键/值对的ListResourceBundle
的示例:
键总是public class MyResources extends ListResourceBundle { protected Object[][] getContents() { return new Object[][] { // LOCALIZE THE SECOND STRING OF EACH ARRAY (e.g., "OK") {"OkKey", "OK"}, {"CancelKey", "Cancel"}, // END OF MATERIAL TO LOCALIZE }; } }
String
s。
在这个例子中,键是“OkKey”和“CancelKey”。
在上面的例子中,值也是String
s - “OK”和“Cancel” - 但是它们不一定是。
值可以是任何类型的对象。
您使用适当的getter方法从资源束检索对象。 因为“OkKey”和“CancelKey”都是字符串,您将使用getString
来检索它们:
getter方法都需要键作为参数,并返回对象(如果找到)。 如果没有找到该对象,那么getter方法会抛出一个button1 = new Button(myResources.getString("OkKey")); button2 = new Button(myResources.getString("CancelKey"));
MissingResourceException
。
除了getString
, ResourceBundle
还提供了一种获取字符串数组的方法, getStringArray
以及任何其他类型对象的通用getObject
方法。 使用getObject
时,您必须将结果转换为适当的类型。 例如:
int[] myIntegers = (int[]) myResources.getObject("intList");
Java平台提供的两个子类ResourceBundle
, ListResourceBundle
和PropertyResourceBundle
,提供一个相当简单的方法来创建资源。 如前面的例子中所看到的那样, ListResourceBundle
将其资源作为键/值对列表进行管理。 PropertyResourceBundle
使用属性文件来管理其资源。
如果ListResourceBundle
或PropertyResourceBundle
不适合您的需要,可以自己ResourceBundle
子类。 您的子类必须覆盖两种方法: handleGetObject
和getKeys()
。
ResourceBundle
子类的实现必须是线程安全的,如果它同时被多个线程使用。 该类中非抽象方法的默认实现,以及直接已知的具体子类ListResourceBundle
和PropertyResourceBundle
中的方法是线程安全的。
ResourceBundle.Control
类提供了使用ResourceBundle.Control
实例的getBundle
工厂方法执行捆绑包加载过程所需的ResourceBundle.Control
。
您可以实现自己的子类,以便启用非标准资源束格式,更改搜索策略或定义缓存参数。
有关详细信息,请参阅类和getBundle
工厂方法的说明。
For the getBundle
factory方法不用ResourceBundle.Control
实例,其default behavior的资源束加载可以通过安装ResourceBundleControlProvider
实现进行修改。 在ResourceBundle
类加载时间检测到任何已安装的提供程序。 如果任何一个提供商为给定的基本名称提供了一个ResourceBundle.Control
, 那么将使用该ResourceBundle.Control
而不是默认的ResourceBundle.Control
。 如果安装了多个服务提供商以支持相同的基本名称,则将使用从ServiceLoader
返回的第一个。
getBundle
工厂方法创建的资源束实例被缓存,如果已经缓存,工厂方法会多次返回相同的资源束实例。
getBundle
客户端可以清除缓存,使用生存时间值管理缓存的资源包实例的生命周期,或指定不缓存资源束实例。
请参阅的描述getBundle
factory method , clearCache
, ResourceBundle.Control.getTimeToLive
和ResourceBundle.Control.needsReload
了解详情。
ResourceBundle
子类, MyResources
,管理两个资源(资源数量较多,你可能会使用一个Map
)。
请注意,如果“父级” ResourceBundle
处理具有相同值的相同键(如下面的okKey),则不需要提供值。
你不必限制自己使用一个// default (English language, United States) public class MyResources extends ResourceBundle { public Object handleGetObject(String key) { if (key.equals("okKey")) return "Ok"; if (key.equals("cancelKey")) return "Cancel"; return null; } public Enumeration<String> getKeys() { return Collections.enumeration(keySet()); } // Overrides handleKeySet() so that the getKeys() implementation // can rely on the keySet() value. protected Set<String> handleKeySet() { return new HashSet<String>(Arrays.asList("okKey", "cancelKey")); } } // German language public class MyResources_de extends MyResources { public Object handleGetObject(String key) { // don't need okKey, since parent level handles it. if (key.equals("cancelKey")) return "Abbrechen"; return null; } protected Set<String> handleKeySet() { return new HashSet<String>(Arrays.asList("cancelKey")); } }
ResourceBundle
的家庭。
例如,你可以有异常的消息一组捆, ExceptionResources
( ExceptionResources_fr
, ExceptionResources_de
,...),以及一个用于小部件, WidgetResource
( WidgetResources_fr
, WidgetResources_de
,...);
分解你喜欢的资源。
ListResourceBundle
, PropertyResourceBundle
, MissingResourceException
Modifier and Type | Class and Description |
---|---|
static class |
ResourceBundle.Control
ResourceBundle.Control 定义了在捆绑包加载过程中由
ResourceBundle.getBundle 工厂方法调用的一组回调方法。
|
Modifier and Type | Field and Description |
---|---|
protected ResourceBundle |
parent
此捆绑包的父捆绑。
|
Constructor and Description |
---|
ResourceBundle()
唯一的构造函数。
|
Modifier and Type | Method and Description |
---|---|
static void |
clearCache()
从使用调用者的类加载器加载的缓存中删除所有资源束。
|
static void |
clearCache(ClassLoader loader)
从使用给定的类加载器加载的缓存中删除所有资源束。
|
boolean |
containsKey(String key)
确定给定的
key 是否包含在此
ResourceBundle 或其父包中。
|
String |
getBaseBundleName()
如果已知,则返回此包的基本名称,如果未知,则返回
null 。
|
static ResourceBundle |
getBundle(String baseName)
使用指定的基本名称,默认语言环境和调用者的类加载器获取资源包。
|
static ResourceBundle |
getBundle(String baseName, Locale locale)
使用指定的基本名称和区域设置以及调用者的类加载器获取资源包。
|
static ResourceBundle |
getBundle(String baseName, Locale locale, ClassLoader loader)
使用指定的基本名称,区域设置和类加载器获取资源包。
|
static ResourceBundle |
getBundle(String baseName, Locale targetLocale, ClassLoader loader, ResourceBundle.Control control)
使用指定的基本名称,目标语言环境,类加载器和控件返回资源包。
|
static ResourceBundle |
getBundle(String baseName, Locale targetLocale, ResourceBundle.Control control)
使用指定的基本名称,目标语言环境和控件以及调用者的类加载器返回资源包。
|
static ResourceBundle |
getBundle(String baseName, ResourceBundle.Control control)
使用指定的基本名称,默认语言环境和指定的控件返回资源包。
|
abstract Enumeration<String> |
getKeys()
返回键的枚举。
|
Locale |
getLocale()
返回此资源包的区域设置。
|
Object |
getObject(String key)
从此资源包或其父项之一获取给定密钥的对象。
|
String |
getString(String key)
从此资源束或其父项之一获取给定密钥的字符串。
|
String[] |
getStringArray(String key)
从此资源包或其父项之一获取给定键的字符串数组。
|
protected abstract Object |
handleGetObject(String key)
从此资源包获取给定键的对象。
|
protected Set<String> |
handleKeySet()
返回一个
Set 的键
只包含在这个
ResourceBundle 。
|
Set<String> |
keySet()
返回此
ResourceBundle 及其父级包中
Set 的所有键的Set。
|
protected void |
setParent(ResourceBundle parent)
设置此捆绑包的父捆绑包。
|
protected ResourceBundle parent
getObject
搜索父捆绑。
public String getBaseBundleName()
null
。
如果不是null,那么这是在加载资源束时传递给ResourceBundle.getBundle(...)
方法的baseName
参数的值。
ResourceBundle.getBundle(...)
方法提供和预期。
getBundle(java.lang.String, java.util.Locale, java.lang.ClassLoader)
public final String getString(String key)
key
- 所需字符串的键
NullPointerException
- 如果
key
是
null
MissingResourceException
- 如果没有找到给定键的对象
ClassCastException
- 如果找到给定键的对象不是字符串
public final String[] getStringArray(String key)
key
- 所需字符串数组的键
NullPointerException
- 如果
key
是
null
MissingResourceException
- 如果没有找到给定键的对象
ClassCastException
- 如果找到给定键的对象不是字符串数组
public final Object getObject(String key)
handleGetObject
从此资源束获取对象。
如果不成功,并且父资源束不为空,则调用父进程的getObject
方法。
如果仍然不成功,它会抛出一个MissingResourceException。
key
- 所需对象的关键
NullPointerException
- 如果
key
是
null
MissingResourceException
- 如果没有找到给定键的对象
public Locale getLocale()
protected void setParent(ResourceBundle parent)
getObject
搜索父捆绑。
parent
- 此捆绑包的父包。
public static final ResourceBundle getBundle(String baseName)
getBundle(baseName, Locale.getDefault(), this.getClass().getClassLoader())
,
除了getClassLoader()
具有的安全权限运行ResourceBundle
。
有关搜索和实例化策略的完整说明,请参阅getBundle
。
baseName
- 资源包的基本名称,一个完全限定的类名
NullPointerException
- 如果
baseName
是
null
MissingResourceException
- 如果没有找到指定基本名称的资源束
public static final ResourceBundle getBundle(String baseName, ResourceBundle.Control control)
getBundle(baseName, Locale.getDefault(),
this.getClass().getClassLoader(), control),
但getClassLoader()
的安全权限为ResourceBundle
。
有关资源束加载过程的完整描述,请参阅getBundle
和ResourceBundle.Control
。
baseName
- 资源包的基本名称,一个完全限定的类名
control
- 为资源束加载过程提供信息的控件
NullPointerException
- 如果
baseName
或
control
是
null
MissingResourceException
- 如果没有找到指定的基础名称的资源束
IllegalArgumentException
- 如果给定的
control
不能正常执行(例如,
control.getCandidateLocales
返回null。)请注意,根据需要执行control的
control
。
public static final ResourceBundle getBundle(String baseName, Locale locale)
getBundle(baseName, locale, this.getClass().getClassLoader())
,
除了getClassLoader()
的安全权限为ResourceBundle
。
有关搜索和实例化策略的完整说明,请参阅getBundle
。
baseName
- 资源包的基本名称,一个完全限定的类名
locale
- 需要资源束的区域设置
NullPointerException
- 如果
baseName
或
locale
是
null
MissingResourceException
- 如果没有找到指定的基本名称的资源束
public static final ResourceBundle getBundle(String baseName, Locale targetLocale, ResourceBundle.Control control)
getBundle(baseName, targetLocale, this.getClass().getClassLoader(),
control),
除了getClassLoader()
运行的安全权限为ResourceBundle
。
有关资源束加载过程的完整说明,请参阅getBundle
,具体内容请见ResourceBundle.Control
。
baseName
- 资源包的基本名称,一个完全限定的类名
targetLocale
- 需要资源束的区域设置
control
- 为资源束加载过程提供信息的控件
Locale
在
locales
NullPointerException
-如果
baseName
,
locales
或
control
是
null
MissingResourceException
-如果在任何指定基本名称的资源包
locales
可以找到。
IllegalArgumentException
- 如果给定的
control
不能正常执行(例如,
control.getCandidateLocales
返回null。)请注意,根据需要执行control的
control
。
public static ResourceBundle getBundle(String baseName, Locale locale, ClassLoader loader)
该方法的行为与调用getBundle(String, Locale, ClassLoader, Control)
传递默认实例ResourceBundle.Control
相同 ,除非另有ResourceBundle.Control
与ResourceBundleControlProvider
SPI一起提供。 请参阅modifying the default behavior的说明 。
The following describes the default behavior 。
getBundle
使用基本名称,指定的区域设置和默认语言环境(从Locale.getDefault
获得)生成candidate bundle names的序列。 如果指定的语言环境的语言,脚本,国家和变体都是空字符串,则基本名称是唯一的候选包名称。 否则,从指定的区域设置(语言,脚本,国家和变体)的属性值生成候选语言环境列表,并附加到基本名称。 通常,这将如下所示:
baseName + "_" + language + "_" + script + "_" + country + "_" + variant
baseName + "_" + language + "_" + script + "_" + country
baseName + "_" + language + "_" + script
baseName + "_" + language + "_" + country + "_" + variant
baseName + "_" + language + "_" + country
baseName + "_" + language
最后一个组件是一个空字符串的候选组名称,以及下划线。 例如,如果country是一个空字符串,那么上面的第二个和第五个候选组名将被省略。 此外,如果脚本是空字符串,则省略包含脚本的候选名称。 例如,具有语言“de”和变体“JAVA”的区域设置将产生下面具有基本名称“MyResource”的候选名称。
MyResource_de__JAVA
MyResource_de
在变体包含一个或多个下划线('_')的情况下,通过截断最后一个下划线及其后面的部分生成的捆绑名称序列将插入到具有原始变体的候选包名称之后。
例如,对于具有语言“en”的语言环境,脚本“Latn,country”US“和变体”WINDOWS_VISTA“以及组合名称”MyResource“,将生成下面的候选组名称列表:
MyResource_en_Latn_US_WINDOWS_VISTA
MyResource_en_Latn_US_WINDOWS
MyResource_en_Latn_US
MyResource_en_Latn
MyResource_en_US_WINDOWS_VISTA
MyResource_en_US_WINDOWS
MyResource_en_US
MyResource_en
Note: For someLocale
s, the list of candidate bundle names contains extra names, or the order of bundle names is slightly modified. See the description of the default implementation ofgetCandidateLocales
for details.
getBundle
然后迭代候选包名称以找到其可以实例化实际资源束的第一个。 它使用默认控件' getFormats
方法,它为每个生成的名称生成两个bundle名称,第一个是一个类名称,另一个是属性文件名。 对于每个候选包名称,它尝试创建一个资源包:
getBundle
创建getBundle
的新实例并将其用作结果资源包 。 getBundle
尝试使用生成的属性文件名查找属性资源文件。 它通过替换所有“”来从候选组名称生成一个路径名。 带有“/”字符并附加字符串“.properties”的字符。 它尝试使用这个名称使用ClassLoader.getResource
找到一个“资源”。 (请注意, getResource
意义上的“资源”与资源束的内容无关,它只是一个数据容器,例如文件。)如果找到“资源”,则会尝试创建一个新的PropertyResourceBundle
实例从其内容。 如果成功,此实例将成为结果资源包 。 这将一直持续到结果资源束被实例化或者候选包名称列表用尽。 如果没有找到匹配的资源束,则调用默认控件的getFallbackLocale
方法,返回当前的默认语言环境。 使用此语言环境生成新的候选语言环境名称序列,并如上所述重新搜索。
如果仍然没有找到结果包,则单独查看基本名称。 如果仍然失败,则会抛出一个MissingResourceException
。
Once a result resource bundle has been found, its parent chain is instantiated 。 如果结果包已经有一个父(可能是因为它从一个缓存返回),那么链就完成了。
否则, getBundle
检查生成结果资源束的通过期间使用的候选区域设置列表的剩余部分。 (如前所述,省略最终组件为空字符串的候选bundle名称)。当涉及到候选列表的末尾时,它将尝试使用纯包名称。 使用每个候选包名称,它尝试实例化一个资源包(首先查找一个类,然后是一个属性文件,如上所述)。
每当成功时,它将使用新的资源束调用先前实例化的资源束的setParent
方法。 这一直持续到名称列表用尽,或者当前的包已经有一个非空的父项。
一旦父链完成,则返回捆绑包。
注意: getBundle
缓存实例化的资源束,并可能多次返回相同的资源束实例。
注意: baseName
参数应该是一个完全限定的类名。 然而,为了与早期版本兼容,Sun的Java SE运行时环境不会验证这一点,因此可以通过指定路径名(使用“/”)而不是完全限定的类名称(使用“。”来访问PropertyResourceBundle
)。 )。
提供以下类和属性文件:
MyResources.class
MyResources.properties
MyResources_fr.properties
MyResources_fr_CH.class
MyResources_fr_CH.properties
MyResources_en.properties
MyResources_es_ES.class
所有文件的内容都是有效的(即“.class”文件的ResourceBundle
公共非抽象子类,语法正确的“.properties”文件)。
默认语言环境为Locale("en", "GB")
。
使用下面的区域设置参数调用getBundle
将实例化资源束,如下所示:
文件MyResources_fr_CH.properties永远不会被使用,因为它被MyResources_fr_CH.class隐藏。 同样,MyResources.properties也被MyResources.class隐藏。
baseName
- 资源包的基本名称,一个完全限定的类名
locale
- 需要资源束的区域设置
loader
- 从中加载资源束的类加载器
NullPointerException
-如果
baseName
,
locale
,或
loader
是
null
MissingResourceException
- 如果没有找到指定基本名称的资源束
public static ResourceBundle getBundle(String baseName, Locale targetLocale, ClassLoader loader, ResourceBundle.Control control)
getBundle
factory methods with no control
argument不同,给定的control
指定了如何定位和实例化资源束。
在概念上,具有给定control
的捆绑包加载过程在以下步骤中执行。
baseName
targetLocale
和loader
的资源包。 如果在缓存中找到请求的资源束实例,并且实例及其所有父实例的生存周期尚未过期,则将该实例返回给调用者。 否则,此工厂方法继续下面的加载过程。 control.getFormats
方法来获取资源束格式来生成包或资源名称。 字符串"java.class"
和"java.properties"
分别指定基于类和基于property的资源束。 以"java."
开头的其他字符串保留用于将来的扩展名,不得用于应用程序定义的格式。 其他字符串指定应用程序定义的格式。 control.getCandidateLocales
方法来获取搜索资源束的候Locale
的列表。 control.newBundle
方法被调用来实例化一个ResourceBundle
基本包名称,候选区域设置,以及格式。 (请参阅下面的缓存查找的注释。)这一步遍历候选语言环境和格式的所有组合,直到newBundle
方法返回一个ResourceBundle
实例或迭代已用尽所有组合。 例如,如果候选区域设置为Locale("de", "DE")
, Locale("de")
和Locale("")
和格式是"java.class"
和"java.properties"
,则以下是语言环境格式组合的序列,以用于调用control.newBundle
。 Locale
format
Locale("de", "DE")
java.class
Locale("de", "DE")
java.properties
Locale("de")
java.class
Locale("de")
java.properties
Locale("")
java.class
Locale("")
java.properties
Locale("")
的捆绑包),候选区域设置列表只包含Locale("")
,则将捆绑包返回给主叫方。 如果发现一个捆绑包是基础包,但是候选区域设置列表中包含Locale(“”)以外的区域设置,则将该包置于保持状态,然后继续执行步骤6.如果发现一个bundle不是基础包,进入步骤7。 control.getFallbackLocale
方法来获取后备区域设置(替代当前目标区域设置)以尝试进一步查找资源束。 如果该方法返回非空区域设置,它将成为下一个目标区域设置,加载过程从步骤3开始。否则,如果在前一步骤5中找到并保留基础包,则返回给调用者现在。 否则,将抛出MissingResourceException异常。 在上述资源包加载过程中,此工厂方法在调用control.newBundle
方法之前查找缓存。 如果高速缓存中发现的资源束的生存周期已经过期,工厂方法将调用control.needsReload
方法来确定资源束是否需要重新加载。 如果需要重新加载,工厂方法调用control.newBundle
来重新加载资源包。 如果control.newBundle
返回null
,则工厂方法将虚拟资源束放在缓存中作为不存在的资源束的标记,以避免后续请求的查找开销。 这样伪资源束是相同的到期控制下,通过指定的control
。
默认情况下,加载的所有资源束都被缓存。 详情请参考control.getTimeToLive
。
以下是使用默认的ResourceBundle.Control
实现的捆绑包加载过程的示例。
条件:
foo.bar.Messages
Locale
: Locale.ITALY
Locale
: Locale.FRENCH
foo/bar/Messages_fr.properties
和foo/bar/Messages.properties
首先, getBundle
尝试按照以下顺序加载资源束。
foo.bar.Messages_it_IT
类 foo/bar/Messages_it_IT.properties
foo.bar.Messages_it
foo/bar/Messages_it.properties
foo.bar.Messages
foo/bar/Messages.properties
在这一点上, getBundle
发现foo/bar/Messages.properties
,由于它是基本捆绑,被搁置。 getBundle
致电control.getFallbackLocale("foo.bar.Messages", Locale.ITALY)
,返回Locale.FRENCH
。 接下来, getBundle
尝试按照以下顺序加载包。
foo.bar.Messages_fr
类 foo/bar/Messages_fr.properties
foo.bar.Messages
foo/bar/Messages.properties
getBundle
找到foo/bar/Messages_fr.properties
并创建一个ResourceBundle
实例。 然后, getBundle
从候选地区列表中设置其父链。 只有foo/bar/Messages.properties
在列表中找到并getBundle
创建一个ResourceBundle
实例成为该实例的父foo/bar/Messages_fr.properties
。
baseName
- 资源包的基本名称,一个完全限定的类名
targetLocale
- 需要资源束的区域设置
loader
- 从中加载资源束的类加载器
control
- 为资源束加载过程提供信息的控件
NullPointerException
-如果
baseName
,
targetLocale
,
loader
,或
control
是
null
MissingResourceException
- 如果没有找到指定的基本名称的资源束
IllegalArgumentException
- 如果给定的
control
无法正常执行(例如,
control.getCandidateLocales
返回null。)请注意,根据需要执行control的
control
。
public static final void clearCache()
ResourceBundle.Control.getTimeToLive(String,Locale)
public static final void clearCache(ClassLoader loader)
loader
- 类加载器
NullPointerException
- 如果
loader
为空
ResourceBundle.Control.getTimeToLive(String,Locale)
protected abstract Object handleGetObject(String key)
key
- 所需对象的关键
NullPointerException
- 如果
key
是
null
public abstract Enumeration<String> getKeys()
Enumeration
的这个
ResourceBundle
及其父级包含的键。
public boolean containsKey(String key)
key
是否包含在此
ResourceBundle
或其父包中。
key
- 资源
key
true
如果给定的key
包含在这个ResourceBundle
或其父包中;
false
否则。
NullPointerException
- 如果
key
是
null
public Set<String> keySet()
ResourceBundle
及其父软件包中
Set
的所有键的Set。
ResourceBundle
及其父级
Set
的所有键的Set。
protected Set<String> handleKeySet()
Set
的键只包含在这个ResourceBundle
。
默认实现返回一个Set
由返回键getKeys
,除了为其的那些方法handleGetObject
方法返回null
。 一旦创建了Set
,该值保留在此ResourceBundle
中,以避免在后续调用中产生相同的Set
。 子类可以覆盖此方法以更快的处理。
Set
的键只包含在这个
ResourceBundle