类 java.util.ResourceBundle
java.lang.Object | +----java.util.ResourceBundle
- public abstract class ResourceBundle
- extends Object
- 下列类的父类:
- ListResourceBundle, PropertyResourceBundle
资源束包含特定于语言环境的对象。当程序需要一个特定于语言环境的资源时,如 String
,程序可以从适合当前用户语言环境的资源束中装入它。以这种方式,可以写大部分独立于用户语言环境的程序代码,它与大部分资源束中的特定于语言环境的信息相隔离。
这使得编程可以:
一个资源束从概念上讲是相关的类集合,这些类是从 ResourceBundle
继承而来的。ResourceBundle
的每个相关的子类有同一基名并加上标识它的语言环境的附加成分。例如,假设您的资源束命名为MyResources
。您写的第一个类可能是缺省的资源束,它与它的家族有同一个名字--MyResources
。也可按需要提供许多特定于语言环境的类:例如,可能为它提供一个德文的名字MyResources_de
。
ResourceBundle
的每个相关的子类包含同样的项目,但是项目已经为那个ResourceBundle
子类描述的语言环境所翻译。例如,MyResources
和MyResources_de
可能都有一个用在确认操作按钮上的 String
。在MyResources
中,String
可能包含 OK
,在 MyResources_de
中,它可能包含 Gut
。
如果对不同的国家有不同的资源,可做出规定:例如, MyResources_de_CH
是Switzerland 的资源。如--果仅想更改规定中的一些资源,可以这样做。
当您的程序需要特定于语言环境的对象时,它使用 getBundle
方法装入ResourceBundle
类:
第一个参数指定包含有疑问对象的资源束的家族名。第二个参数指定了期望的语言环境。ResourceBundle myResources = ResourceBundle.getBundle("MyResources", currentLocale);
getBundle
使用这两个参数来构造 ResourceBundle
子类的名字,它应按下面的方法装入。资源束用不同的后缀查找类,根据(1) 期望的语言环境和 (2) 缺省的语言环境(基类),以下面从更低级别(指定较多的)到父类级别(指定较少的)的顺序来查找:
baseclass + "_" + language1 + "_" + country1 + "_" +variant1
baseclass + "_" + language1 + "_" + country1
baseclass + "_" + language1
baseclass
baseclass + "_" + language2 + "_" + country2 + "_" + variant2
baseclass + "_" + language2 + "_" + country2
baseclass + "_" + language2
查找的结果是一个类,但是那个类可能由磁盘上的特性文件支持。如果查找失败,getBundle()
抛出MissingResourceException
异常。
基类必须完全合格(例如,myPackage.MyResources
, 而不仅仅是MyResources
)。 它必须是您的代码可执行的;它不能是对调用ResourceBundle.getBundle
的包私有的类。
注意:ResourceBundle
被内部用于访问NumberFormat
s、Collation
等。查找策略是相同的。
资源束包含键/值对。键用于唯一地识别资源束中特定于语言环境的对象。下面是一个包含键/值对的ListResourceBundle
的例子:
键总是class MyResource extends ListResourceBundle { public Object[][] getContents() { return contents; } static final Object[][] contents = { // LOCALIZE THIS {"OkKey", "OK"}, {"CancelKey", "Cancel"}, // END OF MATERIAL TO LOCALIZE }; }
String
。 在这个例子中,键是 OkKey
和CancelKey
。 在上面的例子中,值也是String
--OK
和Cancel
--但是它们不是一定如此。值可以是任何类型的对象。使用适当的获取方法从资源束中获取一个对象。因为 OkKey
和CancelKey
都是字符串,可用 getString
方法检索它们:
获取方法都要求把键作为一个参数,并且如果找到的话就返回这个对象。如果对象未找到,获取方法抛出button1 = new Button(myResourceBundle.getString("OkKey")); button2 = new Button(myResourceBundle.getString("CancelKey"));
MissingResourceException
异常。除了 getString
,资源束支持获取不同类型对象的其它方法,例如getStringArray
。如果没有任何对象匹配这些方法,可以使用getObject
,并把结果映射成适当的类型。例如:
int[] myIntegers = (int[]) myResources.getObject("intList");
注意:应该一直提供没有后缀的基类。 如果要求的语言环境不存在,这将是类的"最后选择"。例如,下面一个类 MyResources
。它碰巧包含 US 字符串,所以我们不必用显式的MyResource_en
或 MyResource_en_US
。
JDK 提供了 ResourceBundle
的两个子类:ListResourceBundle
和PropertyResourceBundle
, 它们提供了非常简单的创建资源的方法。(一旦序列化完全被集成,将提供另一个方法。) 如在先前的例子中所见到的,ListResourceBundle
把它的资源作为键/值对管理。 PropertyResourceBundle
使用特性文件管理它的资源。
如果 ListResourceBundle
或PropertyResourceBundle
不符合您的需求,您可写自己的ResourceBundle
子类。您写的子类必须覆盖两个方法:handleGetObject
和getKeys()
。
下面是 ResourceBundle
子类管理少数资源的例子(对于更大的资源,应使用Hashtable
)。注意,如果未找到键,handleGetObject
必须返回null。注意,如果一个“父类级别的”ResourceBundle
处理有同一值( 见下面的 uk )的同一键,您不必提供任何值。
例子:
不必限制自己使用单个系列的abstract class MyResources extends ResourceBundle { public Object handleGetObject(String key) { if (key.equals("okKey")) return "Ok"; if (key.equals("cancelKey")) return "Cancel"; return null; } } abstract class MyResources_de extends MyResources { public Object handleGetObject(String key) { if (key.equals("okKey")) return "Gut"; if (key.equals("cancelKey")) return "Vernichten"; return null; } } abstract class MyResources_uk extends MyResources { public Object handleGetObject(String key) { // don't need okKey, since parent level handles it. if (key.equals("cancelKey")) return "Dispose"; return null; } }
ResourceBundle
。例如,可以有一个用于出错信息的束集合,ExceptionResources
(ExceptionResources_fr
,ExceptionResources_de
, ...) , 以及一个用于小工具的束集合,WidgetResource
(WidgetResources_fr
,WidgetResources_de
, ...); 按您的需要断开资源。- 参见:
- ListResourceBundle, PropertyResourceBundle, MissingResourceException
变量索引
- parent
- 当父类束不包含特定资源时,可通过 getObject 查阅它。
构造子索引
- ResourceBundle()
方法索引
- getBundle(String)
- 获取恰当的资源束子类。
- getBundle(String, Locale)
- 获取恰当的资源束子类。
- getKeys()
- 返回键的枚举。
- getObject(String)
- 从资源束获取一个对象。
- getString(String)
- 从资源束获取一个对象。
- getStringArray(String)
- 从资源束获取一个对象。
- handleGetObject(String)
- 从资源束获取一个对象。
- setParent(ResourceBundle)
- 设置该束的父类束。
变量
parentprotected ResourceBundle parent
- 当父类束不包含特定的资源时,可通过 getObject 查阅它。
构造子
ResourceBundlepublic ResourceBundle()
方法
getStringpublic final String getString(String key) throws MissingResourceException
- 从资源束获取一个对象。
保存映射的便捷方法。 - 参数:
- key - 参见类描述。
public final String[] getStringArray(String key) throws MissingResourceException
- 从资源束获取一个对象。
保存映射的便捷方法。 - 参数:
- key - 参见类描述。
public final Object getObject(String key) throws MissingResourceException
- 从资源束获取一个对象。
- 参数:
- key - 参见类描述。
public static final ResourceBundle getBundle(String baseName) throws MissingResourceException
- 获取适当的资源束子类。
- 参数:
- baseName - 参见类描述。
public static final ResourceBundle getBundle(String baseName, Locale locale)
- 获取适当的资源束子类。
- 参数:
- baseName - 参见类描述。
- locale - 参见类描述。
protected void setParent(ResourceBundle parent)
- 设置该束的父类束。当父类束不包含特定的资源时,可通过 getObject 搜索它。
- 参数:
- parent - 该束的父类束。
protected abstract Object handleGetObject(String key) throws MissingResourceException
- 从资源束获取一个对象。 注意:子类必须覆盖。
- 参数:
- key - 参见类描述。
public abstract Enumeration getKeys()
- 返回键的枚举。 注意:子类必须覆盖。