标题：ResourceBundle
继承关系
java.util 类 ResourceBundlejava.lang.Object
∟util.ResourceBundle
直接已知子类： 
ListResourceBundle, PropertyResourceBundle 
public abstract class ResourceBundle extends Object
资源束包含特定于语言环境的对象。当程序需要一个特定于语言环境的资源时，如 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 子类的名字，它应按下面的方法装入。语言查找顺序ResourceBundle按照以下顺序查找资源，但是注意，默认语言一般都是指系统语言：[1]
<baseclass>+<specific language>+<specific country>+<specific variant>
<baseclass>+<specific language>+<specific country>
<baseclass>+<specific language>
<baseclass>+<default language>+<default country>+<default variant>
<baseclass>+<default language>+<default country>
<baseclass>+<default language>
<baseclass>
如果均未找到，则抛出 MissingResourceException异常。
查找的结果是一个类，但是那个类可能由磁盘上的特性文件支持。如果查找失败，getBundle() 抛出 MissingResourceException 异常。 基类必须 完全合格(例如，myPackage.MyResources, 而不仅仅是 MyResources)。 它必须是您的代码可执行的；它不能是对调用 ResourceBundle.getBundle 的包私有的类。 注意：ResourceBundle 被内部用于访问 NumberFormats、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, ...); 按您的需要断开资源。
作用
ResourceBundle最大的好处是可以使你的程序国际化，在bundle文件名后加上国家、语言关键字，那系统就会自动载入相应的bundle文件。 
比如： 
bundle.properties             缺省 
bundle_zh.properties       中文 
bundle_ja.properties       日文 
ResourceBundle   bundle=   ResourceBundle.getBundle( "bundle "); 
如果你的系统是中文的，那就会自动加载bundle_zh.properties       
需要注意的是，多字节编码的bundle需要用native2ascii转成unicode编码。