java 资源包(ResourceBundle) 详解【1】



java.util 
类 ResourceBundle
java.lang.Object
  java.util.ResourceBundle
直接已知子类: 
ListResourceBundle, PropertyResourceBundle 


--------------------------------------------------------------------------------


public abstract class ResourceBundle   extends Object资源包包含特定于语言环境的对象。
        当程序需要一个特定于语言环境的资源时(如 String),程序可以从适合当前用户语言环境的资源包中加载它。
使用这种方式,可以编写很大程度上独立于用户语言环境的程序代码,它将资源包中大部分(即便不是全部)特定于语言环境的信息隔离开来。 


这使编写的程序可以: 


轻松地本地化或翻译成不同的语言 
一次处理多个语言环境 
以后可以轻松进行修改,以便支持更多的语言环境 
资源包属于这样的系列,其成员共享一个公共的基本名称,但是名称中还有标识其语言环境的其他组件。


例如,某个资源包系列的基本名称可能是 "MyResources"。该系列应该有一个默认资源包,其名称与其系列名相同( "MyResources"),
如果不支持指定的语言环境,则应该将此资源包用作最后的手段。
然后,此系列可根据需要提供特定于语言环境的成员,例如一个名为 "MyResources_de" 的德语资源包。 


一个系列中的每个资源包都包含相同的项,但是这些项已经针对该资源包所代表的语言环境进行了翻译。
例如,"MyResources" 和 "MyResources_de" 可能有用在取消操作按钮上的 String。
在 "MyResources" 中,String 可能包含 "Cancel",而 "MyResources_de" 中则可能包含 "Abbrechen"。 


如果不同的国家/地区有不同的资源,则可以对它们进行限定:例如,"MyResources_de_CH" 包含瑞士 (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 类型。在此示例中,两个键是 "OkKey" 和 "CancelKey"。
 在上面的示例中,值也是 String 类型,即 "OK" 和 "Cancel",但并非必须如此。值可以是任意对象类型。 
可以使用适当的获取方法从资源包中获取某个对象。因为 "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.Control:

http://blog.csdn.net/itm_hadf/article/details/7515149
ResourceBundle.Control 类提供通过带 ResourceBundle.Control 实例的 getBundle 工厂方法执行包加载进程所需的信息。
为了启用非标准资源包格式、更改搜索策略或定义缓存参数,可以实现自己的子类。
有关细节请参考类和 getBundle 工厂方法的描述。 


缓存管理
getBundle 工厂方法创建的资源包实例是默认缓存的,如果资源包实例已经缓存,那么这些工厂方法将多次返回相同的资源包实例。
getBundle 客户端可以清除缓存、使用生存时间值管理已缓存资源包实例的生命周期,或者指定不缓存资源包实例。
有关细节请参考getBundle 工厂方法、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 等);


 可以按自己喜欢的方式分解资源。 


构造方法摘要
ResourceBundle()
          唯一的构造方法(由子类构造方法调用,通常是隐式的)。
 
方法摘要
static void clearCache()
          从已经使用调用者的类加载器加载的缓存中移除所有资源包。
static void clearCache(ClassLoader loader)
          从已经使用给定类加载器加载的缓存中移除所有资源包。
 boolean containsKey(String key)
          确定给定 key 是否包含在此 ResourceBundle 及其父包中。
static ResourceBundle getBundle(String baseName)
          使用指定的基本名称、默认的语言环境和调用者的类加载器获取资源包。
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,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()
          返回 包含在此 ResourceBundle 中的键的 Set
 Set<String> keySet()
          返回此 ResourceBundle 及其父包中包含的所有键的 Set
protected  void setParent(ResourceBundle parent)
          设置此包的父包。

你可能感兴趣的:(eclipse,tomcat,ClassLoader,String,语言,button)