学科分类
目录
Java Web

ResourceBundle类

在开发一个国际化的Web应用时,通常会存储许多用于保存各个国家语言的资源文件,这些资源文件都需要使用类加载器来加载,这样的加载方式比较麻烦,为了方便获取这些资源文件,JDK提供了一个ResourceBundle类,该类位于java.util包中,用于描述一个资源包,一个资源包用于包含一组与某个本地环境相关的对象,可以从一个资源包中获取特定的本地环境的对象。对于不同的本地环境,可以有不同的ResourceBundle对象与之关联。本小节将针对ResourceBundle进行详细地讲解。

1、资源包简介

在设计一个国际化的应用时,应该把程序显示的文本内容(例如,菜单和按钮的标题)从源文件中分离出来,放在独立的资源文件(扩展名为.properties的文件)中,并针对不同的本地环境编写不同的资源文件,例如,在英语资源文件中写入“hello”,在中文资源文件中写入“你好”,这些资源文件共同组成一个资源包。

一个资源包中每个资源文件都必须拥有共同的基名。除了基名,每个资源文件的名称中还必须有标识其本地信息的附加部分。

例如:一个资源包的基名是myproperties,对应资源文件的名称如下:

● 默认资源文件名:myproperites.properties

● 对应的中文资源文件名为:myproperites_zh.properties

● 对应的英文资源文件名为:myproperites_en.properties

在上述资源文件中,“zh”和“en”代表本地环境的语言代码。如果要为使用相同语言的不同国家的资源文件,则还需在语言代码的后面增加代表国家的代码,例如,英语(美国)对应的资源文件名称为“myproperites_en_US.properties”。

一般情况下,每个资源包中都有一个默认的资源文件,以资源包的基名命名,不带标识本地信息的附加部分,如果应用程序在资源包中找不到某个本地环境匹配的资源文件,就会选择该资源包中的默认资源文件。

2、资源文件格式

资源文件通常采用java.util.Properties类要求的文件格式,其中包含每项资源信息的名称和值,每个名称用于唯一标识一个资源信息,值则用于指定资源信息在某个本地环境下的内容,也就类似于Map集合中 “key=value”的形式,示例代码如下:

username=itcast

需要注意的是,一个资源包中的所有资源文件的关键字必须相同,值则为相应国家的文字,而且资源文件中保存的字符串,都是ASCII字符,对于所有非ACSII字符,须先进行编码。对于中文字符,需要将其转换相应的Unicode编码,其格式为\uXXXX。为此,JDK中提供了native2ascII命令,用于将本地非ASCII字符转换为Unicode编码,具体操作步骤将在本节动手体验中详细讲解。

3、创建ResourceBundle对象,读取资源文件

ResourceBundle类提供了两个用于创建ResourceBundle对象的静态方法,该方法用于装载资源文件,并创建ResourceBundle实例,具体如下:

● getBundle(String baseName)

● getBundle(String baseName,Locale locale)

以上两个方法中的参数baseName用于指定资源文件的名称,参数Locale用于指定使用的Locale对象,如果没有指定Locale参数,则使用本地默认的Locale,示例代码如下:

Locale locale=Locale.US;
ResourceBundle myResources= ResourceBundle.getBundle("MyResources",locale);

使用getBundle()方法创建好ResourceBundle对象之后,应用程序就可以加载相应的资源文件,并通过ResourceBundle对象的getString()方法,就可以获取资源文件中指定的资源名所对应的值。

为了让读者更好的学习ResourceBundle,接下来通过一个具体的案例来演示如何使用ResourceBundle读取资源文件。首先需要在chapter10工程的src根目录中,编写一个名为MyResources_en.properties的资源文件(创建一个File文件,将该文件命名为MyResources_en.properties),在该文件中存储一些信息,如下所示:

key = Hello
value = Nice to meet you

接下来在chapter10工程的cn.itcast.chapter10包中,编写一个MyResourcesBundle.java程序,用于读取资源文件,如例1所示。

例1 MyResourcesBundle.java

 1  package cn.itcast.chapter10;

 2  import java.util.*;

 3  public class MyResourcesBundle {

 4    public static void main(String[] args) {

 5      Locale locale=Locale.US;

 6      ResourceBundle myResources=

 7        ResourceBundle.getBundle("MyResources",locale);

 8      String Key=myResources.getString("key");

 9      String Value=myResources.getString("value");

 10     System.out.println("key:"+Key); 

 11     System.out.println("value:"+Value); 

 12   }

 13 }

运行MyResourcesBundle.java程序,此时,控制台窗口中显示的结果如图1所示。

图1 控制台窗口

从图1所示的运行结果可以看出,使用ResourceBundle对象成功的获取到了MyResources_en.properties资源文件中存储的Key值和Value值。

:动手体验:使用native2ascii命令转换字符编码

前面我们讲过,在properties属性文件中保存的字符串,都是ASCII字符,对于所有非ACSII字符,须先进行编码。对于中文的字符串要想保存在properties文件中,就必须将其转换为相应的Unicode编码, 接下来分步骤讲解如何使用native2ascii命令转换字符编码。

(1)在D盘根目录编写一个使用中文GB2312字符集编码的temp.properties资源文件,内容具体如下:

key=你好
value=很高兴见到你

(2)在命令行窗口中进入temp.properties文件所在的目录,执行native2ascii命令,具体如下:

native2ascii -encoding gb2312 temp.properties MyResources_zh.properties

上述这行命令的意思,是将一个使用GB2312字符集编码的temp.properties文件转换为Unicode编码,并将转换后的结果保存到MyResources_zh.properties文件中。

(3)执行完native2ascii命令后,会在当前目录下生成一个名为MyResources_zh.properties文件,使用记事本程序打开MyResources_zh.properties文件,该文件中的内容具体如下:

key=\u4f60\u597d
value=\u5f88\u9ad8\u5174\u89c1\u5230\u4f60

可见,在新生成的MyResources_zh.properties文件中,本地字符集编码的字符都被转换成了Unicode编码的转义序列。

(4)接下来将生成的MyResources_zh.properties文件拷贝到chapter10工程的src根目录下,并删除原来的MyResources_en.properties文件,再次运行例10-2,此时控制台窗口中显示的结果如图2所示。

图2 控制台窗口

从图2中可以看出,MyResources_zh.properties文件中的内容全部被成功的读取了,这是因为我们将中文的字符串转换为Unicode编码后,ResourceBundle对象便可以读取相应的资源文件了。

点击此处
隐藏目录