资源包包含特定于语言环境的对象。当程序需要一个特定于语言环境的资源时(如 String),程序可以从适合当前用户语言环境的资源包中加载它
主要API如下
// 使用指定的基本名称、语言环境和调用者的类加载器获取资源包。调用此方法等同于调用 // getBundle(baseName, locale, this.getClass().getClassLoader()) public static final ResourceBundle getBundle(String baseName,Locale locale) // 返回键的枚举。 public abstract Enumeration<String> getKeys() // 从此资源包或它的某个父包中获取给定键的对象。此方法首先尝试使用 handleGetObject 从此资源包中获取对象。 // 如果不成功,并且父资源包不为 null,则调用父包的 getObject 方法。 // 如果仍不成功,则抛出 MissingResourceException public final Object getObject(String key)
子接口 java.util.PropertyResourceBundle , java.util.ListResourceBundle
PropertyResourceBundle 由于写入的是.properties文件,所以保存的值都是字符串,用文件实现
ListResourceBundle 可以保存任意类型的数据,用类来实现, 主要实现 contents 方法
import java.util.*; public class StatsBundle_ja_JP extends ListResourceBundle { public Object[][] getContents() { return contents; } private Object[][] contents = { { "GDP", new Integer(21300) }, { "Population", new Integer(125449703) }, { "Literacy", new Double(0.99) }, } }
注意:getBundel 中的参数 baseName( 取名 LabelsBundle) 有一点说明,
如果用 PropertyResourceBundle, 则相对应的文件名为 LabelsBundle_对应的语言.peropertis(如zh_cn, en, de)等
如果用 ListResourceBundle,则对应的类名为 LabelsBundle_语言名_国家名 如(ja_JP , fr_FR ,en_CA)等
扩展 ResourceBundle
//使用指定基本名称、目标语言环境和控件、调用者的类加载器返回一个资源包。调用此方法等同 //于调用getBundle(baseName, targetLocale, this.getClass().getClassLoader(),control), public static final ResourceBundle getBundle(String baseName,Locale targetLocale,ResourceBundle.Control control) import java.util.*; public class RBControl { public static void main(String[] args) { test(Locale.CHINA); test(new Locale("zh", "HK")); test(Locale.TAIWAN); test(Locale.CANADA); } private static void test(Locale locale) { ResourceBundle rb = ResourceBundle.getBundle("RBControl", locale, new ResourceBundle.Control() { @Override //返回 Locale 的 List,作为 baseName 和 locale 的候选语言环境。在工厂方法每次尝试为目标 Locale 查找资源包时, //由 ResourceBundle.getBundle 工厂方法调用此方法。 public List<Locale> getCandidateLocales(String baseName, Locale locale) { if (baseName == null) throw new NullPointerException(); if (locale.equals(new Locale("zh", "HK"))) { return Arrays.asList( locale, Locale.TAIWAN, // no Locale.CHINESE here Locale.ROOT); } else if (locale.equals(Locale.TAIWAN)) { return Arrays.asList( locale, // no Locale.CHINESE here Locale.ROOT); } return super.getCandidateLocales(baseName, locale); } }); System.out.println("locale: " + locale); System.out.println("\tregion: " + rb.getString("region")); System.out.println("\tlanguage: " + rb.getString("language")); } }