现在的位置: 首页 > 综合 > 正文

java的ResourceBundle.

2013年08月31日 ⁄ 综合 ⁄ 共 1791字 ⁄ 字号 评论关闭

        Java的ResourceBundle是一个很好用的工具,可以很方便的用来实现软件的国际化和本地化功能。因为ResourceBundle能够按照一定的规则,自动寻找目录下符合某个文化和地区的资源文件(.properties文件)。通过为不同的文化和地区提供不同的资源文件,然后让java自动根据规则来读取这些资源文件,实际上就完成软件的本地化工作。

        先看一个小例子,建立一个test工程,目录结构如下:
        test/    
                classMain.java
                message_zh.properties
                message_en.properties
        
        2个message*.properties文件都只有一行,分别是:
                message_zh.properties:
                       msg0="Chinese locale"        
                message_en.properties:
                       msg0="English locale"                             
   
        classMain.java同样简单,主程序只有2行:
                 import java.util.*;

         public class classMain{
             public static void main(String args[])
             {
                  ResourceBundle rb = ResourceBundle.getBundle("message"--);  
                  System.out.println(rb.getString("msg0"));
             }
          }

        编译javac classMain.java即可生成classMain.class文件,分别在中文Locale和英文Locale下运行java classMain.class,会发现输出的字符串分别是“Chinese locale“和“English locale“。
        
        看看上面的2行代码,关键在于ResourceBundle.getBundle(“message“)。显然这个message与那两个message*.properties文件大有关系。查阅一下JDK的文档可以发现,ResourceBundle实际上是把“message“当作一个basename使用,然后根据当前的Locale和国家来查找basename_*.properties文件,所以当Local分别为中文和英文时,ResourceBundle分别使用的就是message_zh.properties和message_en.properties文件。然后ResourceBundle读入找到的.properties文件,并对其中的资源进行处理,这就不难理解ResourceBundle.getString(“msg0“)的结果了(msg0=“** locale“)。

        为了求证以上的分析,我又查看了一下java的源代码,getBundle实际上会转而调用getBundleImpl,getBundleImpl先确定实际使用的Locale,然后根据搜索规则形成一个搜索列表,再交给findBundle处理,然后由findBundle完成实际.properties文件的搜索工作。所有代码均在JDK的java.util.ResourceBundle.java中,不再列举。

        Eclipse的国际化和本地化的实现,实际上就是基于ResourceBundle来实现的(当然,要感谢Eclipse强大的插件机制)。本人因为工作需要,稍稍做了一下了解,顺手记下来,以防忘却。

        本人是Java新手,如有错误,欢迎批评,欢迎鄙视。

抱歉!评论已关闭.