开始之前,我们先解释一下什么是properties类型的资源文件。
在Java语言中,使用一种以.properties为扩展名的文本文件作为资源文件,该类型的文件的内容格式为类似:
#注释语句
some_key=some_value
形式。以#开头的行作为注释行,ResourceBundle类处理时会加以忽略;其余的行可以以 key名=value值 的形式加以记述。
Java的ResourceBundle类可以对这种形式的文件加以处理。
ResourceBundle类的使用方法也非常简单。我们使用一个例子来说明。
我们假设有下面2个properties文件:
- TestProperties.properties
- view plainprint?
- #key=value
- userIdLabel=User Id:
- userNameLabel=User Name:
- #key=value
- userIdLabel=User Id:
- userNameLabel=User Name:
- TestProperties_zh_CN.properties
- view plainprint?
- #key=value
- userIdLabel=用户ID:
- userNameLabel=用户名:
- #key=value
- userIdLabel=用户ID:
- userNameLabel=用户名:
大家可能注意到TestProperties_zh_CN.properties文件名中有一个_zh_CN名称,该名称其实是用于资源文件的本地化处理。什么是本地化呢?我们简单说明一下:我们在进行系统开发时,很多时候需要为不同地区的用户准备不同的界面,比如,如果一个系统同时面向 英语圈的用户以及面向中国的用户,我们就必须为系统准备2套界面(包括消息),一套为英语界面,一套为中文界面。当然,除了界面不同之外,系统的处理过程完全一样。当然我们不可能为它们分别开发2套不同的系统,怎么办呢?这就需要用到资源的本地化处理。也就是说,根据用户所处的地区或语言的不同,分别准备不同的资源文件,这样就可以为不同的用户准备不同的界面但使用的却是同一套系统逻辑。
我们上面的2个文件就是2套不同的资源。
我们是使用ResourceBundle类处理不同资源的代码:
- TestProperties.java
- view plainprint?
- package com.test.properties;
- import java.util.Enumeration;
- import java.util.Locale;
- import java.util.ResourceBundle;
- public class TestProperties {
- public static void main(String []args) {
- String resourceFile = "com.test.properties.TestProperties";
- //创建一个默认的ResourceBundle对象
- //ResourceBundle会查找包com.test.properties下的TestProperties.properties的文件
- //com.test.properties是资源的包名,它跟普通java类的命名规则完全一样:
- //- 区分大小写
- //- 扩展名 .properties 省略。就像对于类可以省略掉 .class扩展名一样
- //- 资源文件必须位于指定包的路径之下(位于所指定的classpath中)
- //另外,对于非西欧字符(比如中日韩文等),需要使用native2ascii命令或类似工具将其转换成ascii码文件格式,否则会显示乱码。
- System.out.println("---Default Locale---");
- ResourceBundle resource = ResourceBundle.getBundle(resourceFile);
- testResourceBundle(resource);
- System.out.println("---Locale.SIMPLIFIED_CHINESE---");
- //创建一个指定Locale(本地化)的ResourceBundle对象,这里指定为Locale.SIMPLIFIED_CHINESE
- //所以ResourceBundle会查找com.test.properties.TestProperties_zh_CN.properties的文件
- //
- //中文相关的Locale有:
- //Locale.SIMPLIFIED_CHINESE : zh_CN
- resource = ResourceBundle.getBundle(resourceFile, Locale.SIMPLIFIED_CHINESE);
- //Locale.CHINA : zh_CN
- //Locale.CHINESE: zh
- testResourceBundle(resource);
- //显示
- //
- }
- private static void testResourceBundle(ResourceBundle resource) {
- //取得指定关键字的value值
- String userIdLabel = resource.getString("userIdLabel");
- System.out.println(userIdLabel);
- //取得所有key值
- Enumeration enu = resource.getKeys();
- System.out.println("keys:");
- while(enu.hasMoreElements()) {
- System.out.println(enu.nextElement());
- }
- }
- }
- package com.test.properties;
- import java.util.Enumeration;
- import java.util.Locale;
- import java.util.ResourceBundle;
- public class TestProperties {
- public static void main(String []args) {
- String resourceFile = "com.test.properties.TestProperties";
- //创建一个默认的ResourceBundle对象
- //ResourceBundle会查找包com.test.properties下的TestProperties.properties的文件
- //com.test.properties是资源的包名,它跟普通java类的命名规则完全一样:
- //- 区分大小写
- //- 扩展名 .properties 省略。就像对于类可以省略掉 .class扩展名一样
- //- 资源文件必须位于指定包的路径之下(位于所指定的classpath中)
- //另外,对于非西欧字符(比如中日韩文等),需要使用native2ascii命令或类似工具将其转换成ascii码文件格式,否则会显示乱码。
- System.out.println("---Default Locale---");
- ResourceBundle resource = ResourceBundle.getBundle(resourceFile);
- testResourceBundle(resource);
- System.out.println("---Locale.SIMPLIFIED_CHINESE---");
- //创建一个指定Locale(本地化)的ResourceBundle对象,这里指定为Locale.SIMPLIFIED_CHINESE
- //所以ResourceBundle会查找com.test.properties.TestProperties_zh_CN.properties的文件
- //
- //中文相关的Locale有:
- //Locale.SIMPLIFIED_CHINESE : zh_CN
- resource = ResourceBundle.getBundle(resourceFile, Locale.SIMPLIFIED_CHINESE);
- //Locale.CHINA : zh_CN
- //Locale.CHINESE: zh
- testResourceBundle(resource);
- //显示
- //
- }
- private static void testResourceBundle(ResourceBundle resource) {
- //取得指定关键字的value值
- String userIdLabel = resource.getString("userIdLabel");
- System.out.println(userIdLabel);
- //取得所有key值
- Enumeration enu = resource.getKeys();
- System.out.println("keys:");
- while(enu.hasMoreElements()) {
- System.out.println(enu.nextElement());
- }
- }
- }
解说:
1,为了便于理解,我们把解说放在Java源代码中了,这里不再详述了。
2,对于中文资源文件TestProperties_zh_CN.properties,需要使用native2ascii 命令将其转换为ascii码。例如:
native2ascii -encoding UTF-8 c:\TestProperties_zh_CN.properties c:\java\com\test\properties\TestProperties_zh_CN.properties
至于native2ascii的详细用法这里不做详述了。
3,将上面3个文件都保存在 c:\java\com\test\properties\ 目录下。其中TestProperties_zh_CN.properties为经过native2ascii转换后的文件。
4,编译执行,将会在屏幕上显示:
c:\java\javac com.test.properties.TestProperties.java
c:\java\java com.test.properties.TestProperties
---Default Locale---
User Id:
keys:
userNameLabel
userIdLabel
---Locale.SIMPLIFIED_CHINESE---
用户ID:
keys:
userNameLabel
userIdLabel
【编辑推荐】