- java.lang.Object
-
- java.util.ResourceBundle
-
- 已知直接子类:
-
ListResourceBundle
,PropertyResourceBundle
public abstract class ResourceBundleextends Object
资源包包含特定于语言环境的对象。 当您的程序需要特定于语言环境的资源(例如,String
,您的程序可以从适合当前用户的语言环境的资源包中加载它。 通过这种方式,您可以编写程序代码,该程序代码在很大程度上独立于用户的语言环境,隔离资源包中大多数(如果不是全部)特定于语言环境的信息。这允许您编写可以:
- 易于本地化或翻译成不同的语言
- 一次处理多个语言环境
- 稍后可以轻松修改以支持更多语言环境
资源包属于其成员共享一个公共基本名称但其名称还具有标识其语言环境的其他组件的系列。 例如,资源包系列的基本名称可能是“MyResources”。 该系列应该有一个默认资源包,其名称与其系列名称相同 - “MyResources” - 如果不支持特定的语言环境,它将用作最后的捆绑包。 然后,系列可以根据需要提供尽可能多的特定于语言环境的成员,例如名为“MyResources_de”的德语成员。
系列中的每个资源包都包含相同的项目,但已针对该资源包所代表的区域设置翻译了这些项目。 例如,“MyResources”和“MyResources_de”都可能具有
String
,该按钮用于取消操作。 在“MyResources”中,String
可能包含“取消”,而在“MyResources_de”中,它可能包含“Abbrechen”。如果不同国家/地区有不同的资源,您可以进行专业化:例如,“MyResources_de_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 - “确定”和“取消” - 但它们不一定是。 值可以是任何类型的对象。您可以使用适当的getter方法从资源包中检索对象。 因为“OkKey”和“CancelKey”都是字符串,所以你可以使用
getString
来检索它们: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
是线程安全的。Resource Bundles and Named Modules
资源包可以通过以下方式部署在模块中:资源包与应用程序一起使用
资源包可以与同一模块中的应用程序一起部署。 在这种情况下,资源包通过调用getBundle(String)
或getBundle(String, Locale)
方法由模块中的代码加载。Resource bundles as service providers
资源包可以部署在一个或多个服务提供者模块中 ,可以使用ServiceLoader
找到它们 。 必须定义service接口或类。 调用者模块声明它使用服务,服务提供者模块声明它们提供服务的实现。 有关开发资源包服务和部署资源包提供程序的信息,请参阅ResourceBundleProvider
。 获取资源包的模块可以是资源包提供者本身; 在这种情况下,该模块仅通过服务提供者机制定位资源包。resource bundle provider可以提供任何格式的资源包,例如XML,它取代了
ResourceBundle.Control
的需要。Resource bundles in other modules and class path
可以封装命名模块中的资源包,以便不能通过其他模块中的代码来定位它。 任何模块都可以访问未命名模块和类路径中的资源包。 资源包遵循Module.getResourceAsStream(String)
中指定的资源封装规则。getBundle
工厂方法没有Control
参数从service providers定位和加载资源包。 它可以继续搜索,就像调用Module.getResourceAsStream(String)
从给定模块中找到命名资源并调用ClassLoader.getResourceAsStream(String)
; 有关详细信息,请参阅getBundle
方法的规范。 仅搜索“java.class
”或“java.properties
”格式的非封装资源包。如果调用者模块是resource bundle provider ,则它不会回退到类加载器搜索。
自动模块中的资源包
资源包的常见格式为.properties文件格式。 通常,.properties
资源包打包在JAR文件中。 仅资源束JAR文件可以作为automatic module轻松部署。 例如,如果JAR文件包含条目“p/q/Foo_ja.properties
”且没有条目.class
,则在解析并定义为自动模块时,不会为此模块派生任何包。 这允许.properties
格式的资源包打包在一个或多个JAR文件中,这些JAR文件可能包含同一目录中的条目,并且可以成功解析为自动模块。的ResourceBundle.Control
ResourceBundle.Control
类提供了getBundle
工厂方法执行捆绑加载过程所需的信息,该方法采用ResourceBundle.Control
实例。 您可以实现自己的子类,以启用非标准资源包格式,更改搜索策略或定义缓存参数。 有关详细信息,请参阅类的说明和getBundle
工厂方法。ResourceBundle.Control
专为部署在未命名模块中的应用程序而设计,例如,支持非标准格式的资源包或在非传统约定中打包本地化资源。ResourceBundleProvider
是更换为ResourceBundle.Control
迁移到模块时。UnsupportedOperationException
采用ResourceBundle.Control
参数的工厂方法时,将抛出ResourceBundle.Control
。For the
getBundle
factory个方法是拿不出ResourceBundle.Control
情况下,他们default behavior资源包加载的可自定义修改ResourceBundleControlProvider
个实现。 如果任何提供程序为给定的基本名称提供ResourceBundle.Control
,则将使用ResourceBundle.Control
而不是默认的ResourceBundle.Control
。 如果有多个服务提供者支持相同的基本名称,则将使用从ServiceLoader
返回的第一个。 命名模块将忽略自定义ResourceBundle.Control
实现。缓存管理
默认情况下,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
,...); 根据你的喜好分解资源。- 从以下版本开始:
- 1.1
- 另请参见:
-
ListResourceBundle
,PropertyResourceBundle
,MissingResourceException
,ResourceBundleProvider
-
-
嵌套类汇总
嵌套类 变量和类型 类 描述 static class
ResourceBundle.Control
ResourceBundle.Control
定义了一组回调方法,这些方法在捆绑加载过程中由ResourceBundle.getBundle
工厂方法调用。
-
字段汇总
字段 变量和类型 字段 描述 protected ResourceBundle
parent
此捆绑包的父捆绑包。
-
构造方法摘要
构造方法 构造器 描述 ResourceBundle()
唯一的构造函数。
-
方法摘要
所有方法 静态方法 实例方法 抽象方法 具体的方法 变量和类型 方法 描述 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, 模块 module)
使用指定的基本名称和代表指定模块的默认语言环境获取资源包。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, 模块 module)
代表指定模块使用指定的基本名称和语言环境获取资源包。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()
返回Set
包含在此的所有键的ResourceBundle
及其父包。protected void
setParent(ResourceBundle parent)
设置此捆绑包的父捆绑。
-
-
-
字段详细信息
-
parent
protected ResourceBundle parent
此捆绑包的父捆绑包。 当此捆绑包不包含特定资源时,由getObject
搜索父捆绑包。
-
-
方法详细信息
-
getBaseBundleName
public String getBaseBundleName()
返回此包的基本名称(如果已知),如果未知,则返回null
。 如果不为null,则这是加载资源包时传递给ResourceBundle.getBundle(...)
方法的baseName
参数的值。- 结果
- 资源包的基本名称,由
ResourceBundle.getBundle(...)
方法提供和预期。 - 从以下版本开始:
- 1.8
- 另请参见:
-
getBundle(java.lang.String, java.util.Locale, java.lang.ClassLoader)
-
getString
public final String getString(String key)
- 参数
-
key
- 所需字符串的键 - 结果
- 给定键的字符串
- 异常
-
NullPointerException
- 如果key
是null
-
MissingResourceException
- 如果找不到给定密钥的对象 -
ClassCastException
- 如果为给定键找到的对象不是字符串
-
getStringArray
public final String[] getStringArray(String key)
- 参数
-
key
- 所需字符串数组的键 - 结果
- 给定键的字符串数组
- 异常
-
NullPointerException
- 如果key
是null
-
MissingResourceException
- 如果找不到给定密钥的对象 -
ClassCastException
- 如果为给定键找到的对象不是字符串数组
-
getObject
public final Object getObject(String key)
从此资源包或其父项之一获取给定键的对象。 此方法首先尝试使用handleGetObject
从此资源包中获取对象。 如果不成功,并且父资源包不为null,则调用父级的getObject
方法。 如果仍然不成功,则抛出MissingResourceException。- 参数
-
key
- 所需对象的关键字 - 结果
- 给定键的对象
- 异常
-
NullPointerException
- 如果key
是null
-
MissingResourceException
- 如果找不到给定密钥的对象
-
getLocale
public Locale getLocale()
返回此资源包的语言环境。 在调用getBundle()之后,可以使用此方法来确定返回的资源包是否确实对应于请求的区域设置,或者是回退。- 结果
- 此资源包的区域设置
-
setParent
protected void setParent(ResourceBundle parent)
设置此捆绑包的父捆绑。 当此捆绑包不包含特定资源时,由getObject
搜索父捆绑包。- 参数
-
parent
- 此捆绑包的父捆绑包。
-
getBundle
public static final ResourceBundle getBundle(String baseName)
使用指定的基本名称,默认语言环境和调用方模块获取资源包。 调用此方法等同于调用getBundle(baseName, Locale.getDefault(), callerModule)
,- 参数
-
baseName
- 资源包的基本名称,完全限定的类名 - 结果
- 给定基本名称和默认语言环境的资源包
- 异常
-
NullPointerException
- 如果baseName
是null
-
MissingResourceException
- 如果找不到指定基本名称的资源包 - 另请参见:
- Resource Bundle Search and Loading Strategy , Resource Bundles and Named Modules
-
getBundle
public static final ResourceBundle getBundle(String baseName, ResourceBundle.Control control)
使用指定的基本名称,缺省语言环境和指定的控件返回资源包。 调用此方法等同于调用getBundle(baseName, Locale.getDefault(), this.getClass().getClassLoader(), control),
除了getClassLoader()
具有的安全权限运行ResourceBundle
。 有关使用ResourceBundle.Control的资源束加载过程的完整说明,请参阅ResourceBundle.Control
。- 参数
-
baseName
- 资源包的基本名称,完全限定的类名 -
control
- 为资源包加载过程提供信息的控件 - 结果
- 给定基本名称和默认语言环境的资源包
- 异常
-
NullPointerException
- 如果baseName
或control
是null
-
MissingResourceException
- 如果找不到指定基本名称的资源包 -
IllegalArgumentException
- 如果给定的control
执行不正确(例如,control.getCandidateLocales
返回null。)请注意,control
验证将根据需要执行。 -
UnsupportedOperationException
- 如果在命名模块中调用此方法 - 从以下版本开始:
- 1.6
-
getBundle
public static final ResourceBundle getBundle(String baseName, Locale locale)
使用指定的基本名称和语言环境以及调用方模块获取资源包。 调用此方法等同于调用getBundle(baseName, locale, callerModule)
,- 参数
-
baseName
- 资源包的基本名称,完全限定的类名 -
locale
- 需要资源包的语言环境 - 结果
- 给定基本名称和语言环境的资源包
- 异常
-
NullPointerException
- 如果baseName
或locale
是null
-
MissingResourceException
- 如果找不到指定基本名称的资源包 - 另请参见:
- Resource Bundle Search and Loading Strategy , Resource Bundles and Named Modules
-
getBundle
public static ResourceBundle getBundle(String baseName, 模块 module)
使用指定的基本名称和代表指定模块的默认语言环境获取资源包。 这种方法相当于调用getBundle(baseName, Locale.getDefault(), module)
- 参数
-
baseName
- 资源包的基本名称,完全限定的类名 -
模块
- 搜索资源包的模块 - 结果
- 给定基本名称和默认语言环境的资源包
- 异常
-
NullPointerException
- 如果baseName
或模块
是null
-
SecurityException
- 如果存在安全管理器且调用者不是指定的模块且没有RuntimePermission("getClassLoader")
-
MissingResourceException
- 如果在指定的模块中找不到指定基本名称的资源包 - 从以下版本开始:
- 9
- 另请参见:
-
ResourceBundleProvider
, Resource Bundle Search and Loading Strategy , Resource Bundles and Named Modules
-
getBundle
public static ResourceBundle getBundle(String baseName, Locale targetLocale, 模块 module)
代表指定模块使用指定的基本名称和语言环境获取资源包。可以封装命名模块中的资源包。 从service provider加载资源包时,调用程序模块必须在其模块描述符中具有适当的uses子句,以声明该模块对命名资源包使用
ResourceBundleProvider
。 否则,它将加载给定模块中本地的资源包,就像调用Module.getResourceAsStream(String)
一样,或者对给定模块的类加载器可见,就像调用ClassLoader.getResourceAsStream(String)
一样 。 从指定模块加载资源包时,它受Module.getResourceAsStream
指定的封装规则的约束 。如果给定的
模块
是未命名的模块,则此方法等效于调用getBundle(baseName, targetLocale, module.getClassLoader()
以加载对给定未命名模块的类加载器可见的资源包。 如果指定的模块是未命名的模块,则仅调用自定义ResourceBundleControlProvider
实现(如果存在)。- 参数
-
baseName
- 资源包的基本名称,完全限定的类名 -
targetLocale
- 需要资源包的语言环境 -
模块
- 搜索资源包的模块 - 结果
- 模块中给定基本名称和语言环境的资源包
- 异常
-
NullPointerException
-如果baseName
,targetLocale
,或模块
为null
-
SecurityException
- 如果存在安全管理器且调用者不是指定的模块且没有RuntimePermission("getClassLoader")
-
MissingResourceException
- 如果在指定的模块
找不到指定基本名称和语言环境的资源包 - 从以下版本开始:
- 9
- 另请参见:
- Resource Bundle Search and Loading Strategy , Resource Bundles and Named Modules
-
getBundle
public static final ResourceBundle getBundle(String baseName, Locale targetLocale, ResourceBundle.Control control)
使用指定的基本名称,目标语言环境和控件以及调用者的类加载器返回资源包。 调用此方法等同于调用getBundle(baseName, targetLocale, this.getClass().getClassLoader(), control),
除了getClassLoader()
具有的安全权限运行ResourceBundle
。 有关使用ResourceBundle.Control的资源束加载过程的完整说明,请参阅ResourceBundle.Control
。- 参数
-
baseName
- 资源包的基本名称,完全限定的类名 -
targetLocale
- 需要资源包的语言环境 -
control
- 为资源包加载过程提供信息的控件 - 结果
- 给定基本名称的资源包和
Locale
中的locales
- 异常
-
NullPointerException
-如果baseName
,locales
或control
为null
-
MissingResourceException
- 如果找不到任何locales
指定基本名称的资源包。 -
IllegalArgumentException
- 如果给定的control
执行不正确(例如,control.getCandidateLocales
返回null)。请注意,control
验证将根据需要执行。 -
UnsupportedOperationException
- 如果在命名模块中调用此方法 - 从以下版本开始:
- 1.6
-
getBundle
public static ResourceBundle getBundle(String baseName, Locale locale, ClassLoader loader)
使用指定的基本名称,语言环境和类加载器获取资源包。当从命名模块调用此方法并且给定的加载器是调用者模块的类加载器时,这相当于调用:
getBundle(baseName, targetLocale, callerModule)
getBundle(baseName, targetLocale, loader, control)
control
是的默认实例ResourceBundle.Control
除非Control
实例是通过提供ResourceBundleControlProvider
SPI。 请参阅modifying the default behavior的说明。 以下描述了默认行为。Resource Bundle Search and Loading Strategy
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是空字符串,则将省略上面的第二个和第五个候选包名称。 此外,如果script是空字符串,则省略包括脚本的候选名称。 例如,具有语言“de”和变体“JAVA”的语言环境将生成下面具有基本名称“MyResource”的候选名称。
MyResource_de__JAVA MyResource_de
在变体包含一个或多个下划线('_')的情况下,通过截断最后一个下划线及其后面的部分生成的一系列包名称将插入到具有原始变体的候选包名称之后。 例如,对于语言为“en”的语言环境,脚本“Latn,country”US“和variant”WINDOWS_VISTA“以及bundle base name”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 some
Locale
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
方法,该方法为每个生成的名称生成两个包名称,第一个是类名,第二个是属性文件名。 对于每个候选包名称,它会尝试创建资源包:- 首先,它尝试使用生成的类名加载类。 如果可以使用指定的类加载器找到并加载这样的类,与ResourceBundle兼容的赋值,可以从ResourceBundle访问,并且可以实例化,则
getBundle
创建getBundle
的新实例并将其用作结果资源包 。 - 否则,
getBundle
尝试使用生成的属性文件名来查找属性资源文件。 它通过替换所有“。”从候选包名称生成路径名。 带有“/”的字符并附加字符串“.properties”。 它尝试使用ClassLoader.getResource
查找具有此名称的“资源”。 (请注意,getResource
意义上的“资源”与资源包的内容无关,它只是数据的容器,例如文件。)如果找到“资源”,它会尝试创建一个新的PropertyResourceBundle
实例来自其内容。 如果成功,此实例将成为结果资源包 。
这将继续,直到实例化结果资源包或候选包名称列表用尽为止。 如果未找到匹配的资源包,则调用默认控件的
getFallbackLocale
方法,该方法返回当前的默认语言环境。 使用此语言环境生成新的候选语言环境名称序列,然后再次搜索,如上所述。如果仍未找到结果包,则仅查找基本名称。 如果仍然失败,则抛出
MissingResourceException
。Once a result resource bundle has been found, its parent chain is instantiated 。 如果结果包已经有父(可能是因为它是从缓存中返回的),则链完成。
否则,
getBundle
检查在生成结果资源包的传递期间使用的候选语言环境列表的剩余部分。 (和之前一样,省略了最终组件为空字符串的候选包名称。)当它到候选列表的末尾时,它会尝试普通包名称。 对于每个候选包名称,它尝试实例化资源包(首先查找类,然后查找属性文件,如上所述)。只要成功,它就会使用新资源包调用先前实例化的资源包
setParent
方法。 这将继续,直到名称列表用尽或当前包已经具有非空父级。父链完成后,将返回包。
注意:
getBundle
缓存实例化的资源包,并且可能多次返回相同的资源包实例。注意:
baseName
参数应该是完全限定的类名。 但是,为了与早期版本兼容,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
ResourceBundle
,语法正确的“.properties”文件)。 默认语言环境为Locale("en", "GB")
。使用下面的语言环境参数调用
getBundle() locale to resource bundle mapping Locale Resource bundle Locale("fr", "CH") MyResources_fr_CH.class, parent MyResources_fr.properties, parent MyResources.class Locale("fr", "FR") MyResources_fr.properties, parent MyResources.class Locale("de", "DE") MyResources_en.properties, parent MyResources.class Locale("en", "US") MyResources_en.properties, parent MyResources.class Locale("es", "ES") MyResources_es_ES.class, parent MyResources.classgetBundle
将实例化资源包,如下所示:永远不会使用文件MyResources_fr_CH.properties,因为它被MyResources_fr_CH.class隐藏。 同样,MyResources.properties也被MyResources.class隐藏。
- API Note:
- 如果调用者模块是命名模块,并且给定的
loader
是调用者模块的类加载器,则此方法等效于getBundle(baseName, locale)
; 否则,它可能无法从命名模块中找到资源包。 请使用getBundle(String, Locale, Module)
代表特定模块加载资源包。 - 参数
-
baseName
- 资源包的基本名称,完全限定的类名 -
locale
- 需要资源包的语言环境 -
loader
- 从中加载资源包的类加载器 - 结果
- 给定基本名称和语言环境的资源包
- 异常
-
NullPointerException
-如果baseName
,locale
,或loader
为null
-
MissingResourceException
- 如果找不到指定基本名称的资源包 - 从以下版本开始:
- 1.2
- 另请参见:
- Resource Bundles and Named Modules
- 首先,它尝试使用生成的类名加载类。 如果可以使用指定的类加载器找到并加载这样的类,与ResourceBundle兼容的赋值,可以从ResourceBundle访问,并且可以实例化,则
-
getBundle
public static ResourceBundle getBundle(String baseName, Locale targetLocale, ClassLoader loader, ResourceBundle.Control control)
使用指定的基本名称,目标语言环境,类加载器和控件返回资源包。 与没有control
参数的getBundle
工厂方法不同,给定的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 combinations for newBundle IndexLocale
format
1Locale("de", "DE")
java.class
2Locale("de", "DE")
java.properties
3Locale("de")
java.class
4Locale("de")
java.properties
5Locale("")
java.class
6Locale("")
java.properties
- 如果上一步未找到资源包,请继续执行步骤6.如果找到的包是基本包(
Locale("")
的包),并且候选语言环境列表仅包含Locale("")
,请将包返回给调用者。 如果找到的捆绑包是基本捆绑包,但候选区域设置列表包含Locale(“”)以外的区域设置,则将捆绑包置于保持状态并继续执行步骤6.如果找到的捆绑包不是基本捆绑包,继续执行第7步。 - 调用
control.getFallbackLocale
方法以获取后备区域设置(替代当前目标区域设置)以尝试进一步查找资源束。 如果该方法返回非空语言环境,则它将成为下一个目标语言环境,并且加载过程从步骤3开始。否则,如果在前面的步骤5中找到并保持基本包,则将其返回给调用者现在。 否则,抛出MissingResourceException。 - 此时,我们发现了一个不是基本包的资源包。 如果此bundle在其实例化期间设置其父级,则将其返回给调用者。 否则,它的parent chain将根据找到它的候选语言环境列表进行实例化。 最后,捆绑包返回给调用者。
在上面的资源包加载过程中,此工厂方法在调用
control.newBundle
方法之前查找缓存。 如果在缓存中找到的资源包的生存时间段已过期,则工厂方法调用control.needsReload
方法以确定是否需要重新加载资源包。 如果需要重新加载,则工厂方法调用control.newBundle
以重新加载资源包。 如果control.newBundle
返回null
,则工厂方法将虚拟资源包放入缓存中作为不存在的资源包的标记,以避免后续请求的查找开销。 这种虚拟资源束处于control
规定的相同到期控制下。默认情况下,所有加载的资源包都会被缓存。 有关详细信息,请参阅
control.getTimeToLive
。以下是使用默认
ResourceBundle.Control
实现的捆绑加载过程的ResourceBundle.Control
。条件:
- 基本包名称:
foo.bar.Messages
- 要求
Locale
:Locale.ITALY
- 默认值
Locale
:Locale.FRENCH
- 可用资源包:
foo/bar/Messages_fr.properties
和foo/bar/Messages.properties
首先,
getBundle
尝试按以下顺序加载资源包。- class
foo.bar.Messages_it_IT
- 文件
foo/bar/Messages_it_IT.properties
- class
foo.bar.Messages_it
- 档案
foo/bar/Messages_it.properties
- class
foo.bar.Messages
- 档案
foo/bar/Messages.properties
此时,
getBundle
找到foo/bar/Messages.properties
,因为它是基本捆绑包而被搁置。getBundle
致电control.getFallbackLocale("foo.bar.Messages", Locale.ITALY)
,返回Locale.FRENCH
。 接下来,getBundle
尝试按以下顺序加载包。- class
foo.bar.Messages_fr
- 档案
foo/bar/Messages_fr.properties
- class
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
验证是根据需要执行的。 -
UnsupportedOperationException
- 如果在命名模块中调用此方法 - 从以下版本开始:
- 1.6
- 此工厂方法查找该指定的高速缓存中的资源包
-
clearCache
public static final void clearCache()
从缓存中删除调用者模块加载的所有资源包。- 从以下版本开始:
- 1.6
- 另请参见:
-
ResourceBundle.Control.getTimeToLive(String,Locale)
-
clearCache
public static final void clearCache(ClassLoader loader)
从缓存中删除已由给定类加载器加载的所有资源包。- 参数
-
loader
- 类加载器 - 异常
-
NullPointerException
- 如果loader
为空 - 从以下版本开始:
- 1.6
- 另请参见:
-
ResourceBundle.Control.getTimeToLive(String,Locale)
-
handleGetObject
protected abstract Object handleGetObject(String key)
从此资源包中获取给定键的对象。 如果此资源包不包含给定键的对象,则返回null。- 参数
-
key
- 所需对象的关键字 - 结果
- 给定键的对象,或null
- 异常
-
NullPointerException
- 如果key
是null
-
getKeys
public abstract Enumeration<String> getKeys()
返回键的枚举。- 结果
- 一个
Enumeration
包含在该键的ResourceBundle
及其父包。
-
containsKey
public boolean containsKey(String key)
确定给定的key
是否包含在此ResourceBundle
或其父包中。- 参数
-
key
- 资源key
- 结果
-
true
如果给定的key
包含在此ResourceBundle
或其父包中; 否则为false
。 - 异常
-
NullPointerException
- 如果key
是null
- 从以下版本开始:
- 1.6
-
keySet
public Set<String> keySet()
返回Set
包含在此的所有键的ResourceBundle
及其父包。- 结果
- 一个
Set
包含在此的所有键的ResourceBundle
及其父包。 - 从以下版本开始:
- 1.6
-
handleKeySet
protected Set<String> handleKeySet()
返回Set
只有在这个包含的键ResourceBundle
。默认实现返回一个
Set
由返回键getKeys
除了用于其的那些方法handleGetObject
方法返回null
。 创建Set
,该值将保留在此ResourceBundle
中,以避免在后续调用中生成相同的Set
。 子类可以覆盖此方法以加快处理速度。- 结果
-
Set
的密钥仅包含在此ResourceBundle
- 从以下版本开始:
- 1.6
-
-