模块  java.base
软件包  java.util

Class ResourceBundle

  • 已知直接子类:
    ListResourceBundlePropertyResourceBundle

    public abstract class ResourceBundle
    extends 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"));
     
    getter方法都需要键作为参数,如果找到则返回对象。 如果未找到该对象,则getter方法抛出MissingResourceException

    除了getString之外, ResourceBundle还提供了用于获取字符串数组的方法, getStringArray ,以及用于任何其他类型的对象的通用getObject方法。 使用getObject ,您必须将结果转换为适当的类型。 例如:

     int[] myIntegers = (int[]) myResources.getObject("intList");
     

    Java平台提供的两个子类ResourceBundleListResourceBundlePropertyResourceBundle ,提供一个相当简单的方法来创建资源。 正如您在前面的示例中简要介绍的那样, ListResourceBundle其资源作为键/值对列表进行管理。 PropertyResourceBundle使用属性文件来管理其资源。

    如果ListResourceBundlePropertyResourceBundle不适合您的需要,您可以编写自己的ResourceBundle子类。 您的子类必须覆盖两个方法: handleGetObjectgetKeys()

    如果多个线程同时使用ResourceBundle子类的实现必须是线程安全的。 此类中的非抽象方法的默认实现以及直接已知的具体子类ListResourceBundlePropertyResourceBundle是线程安全的。

    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客户端可以清除缓存,使用生存时间值管理缓存资源包实例的生存期,或指定不缓存资源包实例。 请参阅的描述getBundlefactory methodclearCacheResourceBundle.Control.getTimeToLiveResourceBundle.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的单个系列。 例如,你可以有异常的消息一组捆, ExceptionResourcesExceptionResources_frExceptionResources_de ,...),以及一个用于小部件, WidgetResourceWidgetResources_frWidgetResources_de ,...); 根据你的喜好分解资源。
    从以下版本开始:
    1.1
    另请参见:
    ListResourceBundlePropertyResourceBundleMissingResourceExceptionResourceBundleProvider
    • 字段详细信息

      • parent

        protected ResourceBundle parent
        此捆绑包的父捆绑包。 当此捆绑包不包含特定资源时,由getObject搜索父捆绑包。
    • 构造方法详细信息

      • ResourceBundle

        public ResourceBundle()
        唯一的构造函数。 (对于子类构造函数的调用,通常是隐式的。)
    • 方法详细信息

      • 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)
        从此资源包或其父项之一获取给定键的字符串。 调用此方法等同于调用
        (String) getObject(key).
        参数
        key - 所需字符串的键
        结果
        给定键的字符串
        异常
        NullPointerException - 如果 keynull
        MissingResourceException - 如果找不到给定密钥的对象
        ClassCastException - 如果为给定键找到的对象不是字符串
      • getStringArray

        public final String[] getStringArray​(String key)
        从此资源包或其父项之一获取给定键的字符串数组。 调用此方法等同于调用
        (String[]) getObject(key).
        参数
        key - 所需字符串数组的键
        结果
        给定键的字符串数组
        异常
        NullPointerException - 如果 keynull
        MissingResourceException - 如果找不到给定密钥的对象
        ClassCastException - 如果为给定键找到的对象不是字符串数组
      • getObject

        public final Object getObject​(String key)
        从此资源包或其父项之一获取给定键的对象。 此方法首先尝试使用handleGetObject从此资源包中获取对象。 如果不成功,并且父资源包不为null,则调用父级的getObject方法。 如果仍然不成功,则抛出MissingResourceException。
        参数
        key - 所需对象的关键字
        结果
        给定键的对象
        异常
        NullPointerException - 如果 keynull
        MissingResourceException - 如果找不到给定密钥的对象
      • getLocale

        public Locale getLocale()
        返回此资源包的语言环境。 在调用getBundle()之后,可以使用此方法来确定返回的资源包是否确实对应于请求的区域设置,或者是回退。
        结果
        此资源包的区域设置
      • setParent

        protected void setParent​(ResourceBundle parent)
        设置此捆绑包的父捆绑。 当此捆绑包不包含特定资源时,由getObject搜索父捆绑包。
        参数
        parent - 此捆绑包的父捆绑包。
      • 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 - 如果 baseNamecontrolnull
        MissingResourceException - 如果找不到指定基本名称的资源包
        IllegalArgumentException - 如果给定的 control执行不正确(例如, control.getCandidateLocales返回null。)请注意, control验证将根据需要执行。
        UnsupportedOperationException - 如果在命名模块中调用此方法
        从以下版本开始:
        1.6
      • 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 -如果 baseNamelocalescontrolnull
        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 Locales, 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 of getCandidateLocales 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 。 。

        Example:

        提供以下类和属性文件:

        • 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将实例化资源包,如下所示:

        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.class

        永远不会使用文件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 -如果 baseNamelocale ,或 loadernull
        MissingResourceException - 如果找不到指定基本名称的资源包
        从以下版本开始:
        1.2
        另请参见:
        Resource Bundles and Named Modules
      • getBundle

        public static ResourceBundle getBundle​(String baseName,
                                               Locale targetLocale,
                                               ClassLoader loader,
                                               ResourceBundle.Control control)
        使用指定的基本名称,目标语言环境,类加载器和控件返回资源包。 与没有control参数的getBundle工厂方法不同,给定的control指定了如何查找和实例化资源包。 从概念上讲,使用给定的control的捆绑加载过程在以下步骤中执行。
        1. 此工厂方法查找该指定的高速缓存中的资源包baseNametargetLocaleloader 如果在缓存中找到请求的资源包实例,并且实例及其所有父实例的生存时间段尚未到期,则将实例返回给调用者。 否则,此工厂方法继续下面的加载过程。
        2. 调用control.getFormats方法以获取资源包格式以生成包或资源名称。 字符串"java.class""java.properties"指定基于类和基于property的资源包。 "java."开头的其他字符串保留用于将来的扩展,不得用于应用程序定义的格式。 其他字符串指定应用程序定义的格式。
        3. 使用目标语言环境调用control.getCandidateLocales方法以获取搜索资源包的候选列表Locale
        4. 调用control.newBundle方法以实例化基本包名称,候选语言环境和格式的ResourceBundle (请参阅下面缓存查找中的注释。)此步骤将迭代候选语言环境和格式的所有组合,直到newBundle方法返回ResourceBundle实例或迭代已用完所有组合。 例如,如果候选区域设置为Locale("de", "DE")Locale("de")Locale("")和格式是"java.class""java.properties" ,再下面是语言环境格式组合的序列,以用于调用control.newBundle locale-format combinations for newBundle Index Locale format 1 Locale("de", "DE") java.class 2 Locale("de", "DE") java.properties 3 Locale("de") java.class 4 Locale("de") java.properties 5 Locale("") java.class 6 Locale("") java.properties
        5. 如果上一步未找到资源包,请继续执行步骤6.如果找到的包是基本包( Locale("")的包),并且候选语言环境列表仅包含Locale("") ,请将包返回给调用者。 如果找到的捆绑包是基本捆绑包,但候选区域设置列表包含Locale(“”)以外的区域设置,则将捆绑包置于保持状态并继续执行步骤6.如果找到的捆绑包不是基本捆绑包,继续执行第7步。
        6. 调用control.getFallbackLocale方法以获取后备区域设置(替代当前目标区域设置)以尝试进一步查找资源束。 如果该方法返回非空语言环境,则它将成为下一个目标语言环境,并且加载过程从步骤3开始。否则,如果在前面的步骤5中找到并保持基本包,则将其返回给调用者现在。 否则,抛出MissingResourceException。
        7. 此时,我们发现了一个不是基本包的资源包。 如果此bundle在其实例化期间设置其父级,则将其返回给调用者。 否则,它的parent chain将根据找到它的候选语言环境列表进行实例化。 最后,捆绑包返回给调用者。

        在上面的资源包加载过程中,此工厂方法在调用control.newBundle方法之前查找缓存。 如果在缓存中找到的资源包的生存时间段已过期,则工厂方法调用control.needsReload方法以确定是否需要重新加载资源包。 如果需要重新加载,则工厂方法调用control.newBundle以重新加载资源包。 如果control.newBundle返回null ,则工厂方法将虚拟资源包放入缓存中作为不存在的资源包的标记,以避免后续请求的查找开销。 这种虚拟资源束处于control规定的相同到期控制下。

        默认情况下,所有加载的资源包都会被缓存。 有关详细信息,请参阅control.getTimeToLive

        以下是使用默认ResourceBundle.Control实现的捆绑加载过程的ResourceBundle.Control

        条件:

        • 基本包名称: foo.bar.Messages
        • 要求LocaleLocale.ITALY
        • 默认值LocaleLocale.FRENCH
        • 可用资源包: foo/bar/Messages_fr.propertiesfoo/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 -如果 baseNametargetLocaleloader ,或 controlnull
        MissingResourceException - 如果找不到指定基本名称的资源包
        IllegalArgumentException - 如果给定的 control没有正确执行(例如, control.getCandidateLocales返回null。)请注意, control验证是根据需要执行的。
        UnsupportedOperationException - 如果在命名模块中调用此方法
        从以下版本开始:
        1.6
      • handleGetObject

        protected abstract Object handleGetObject​(String key)
        从此资源包中获取给定键的对象。 如果此资源包不包含给定键的对象,则返回null。
        参数
        key - 所需对象的关键字
        结果
        给定键的对象,或null
        异常
        NullPointerException - 如果 keynull
      • getKeys

        public abstract Enumeration<String> getKeys()
        返回键的枚举。
        结果
        一个 Enumeration包含在该键的 ResourceBundle及其父包。
      • containsKey

        public boolean containsKey​(String key)
        确定给定的 key是否包含在此 ResourceBundle或其父包中。
        参数
        key - 资源 key
        结果
        true如果给定的key包含在此ResourceBundle或其父包中; 否则为false
        异常
        NullPointerException - 如果 keynull
        从以下版本开始:
        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