Java语言对properties资源文件的处理
创始人
2024-04-04 07:01:42
0

开始之前,我们先解释一下什么是properties类型的资源文件。

在Java语言中,使用一种以.properties为扩展名的文本文件作为资源文件,该类型的文件的内容格式为类似:

#注释语句
some_key=some_value

形式。以#开头的行作为注释行,ResourceBundle类处理时会加以忽略;其余的行可以以 key名=value值 的形式加以记述。

Java的ResourceBundle类可以对这种形式的文件加以处理。

ResourceBundle类的使用方法也非常简单。我们使用一个例子来说明。

我们假设有下面2个properties文件:

  1. TestProperties.properties  
  2.  
  3. view plainprint?  
  4. #key=value     
  5. userIdLabel=User Id:      
  6. userNameLabel=User Name:     
  7. #key=value 
  8. userIdLabel=User Id:   
  9. userNameLabel=User Name:  
  10.  
  11. TestProperties_zh_CN.properties  
  12.  
  13. view plainprint?  
  14. #key=value     
  15. userIdLabel=用户ID:      
  16. userNameLabel=用户名:     
  17. #key=value 
  18. userIdLabel=用户ID:   
  19. userNameLabel=用户名: 

大家可能注意到TestProperties_zh_CN.properties文件名中有一个_zh_CN名称,该名称其实是用于资源文件的本地化处理。什么是本地化呢?我们简单说明一下:我们在进行系统开发时,很多时候需要为不同地区的用户准备不同的界面,比如,如果一个系统同时面向 英语圈的用户以及面向中国的用户,我们就必须为系统准备2套界面(包括消息),一套为英语界面,一套为中文界面。当然,除了界面不同之外,系统的处理过程完全一样。当然我们不可能为它们分别开发2套不同的系统,怎么办呢?这就需要用到资源的本地化处理。也就是说,根据用户所处的地区或语言的不同,分别准备不同的资源文件,这样就可以为不同的用户准备不同的界面但使用的却是同一套系统逻辑。

我们上面的2个文件就是2套不同的资源。

我们是使用ResourceBundle类处理不同资源的代码:

  1. TestProperties.java  
  2.  
  3. view plainprint?  
  4. package com.test.properties;     
  5.      
  6. import java.util.Enumeration;     
  7. import java.util.Locale;     
  8. import java.util.ResourceBundle;     
  9.      
  10. public class TestProperties  {     
  11.      
  12.     public static void main(String []args) {     
  13. String resourceFile = "com.test.properties.TestProperties";     
  14. //创建一个默认的ResourceBundle对象     
  15. //ResourceBundle会查找包com.test.properties下的TestProperties.properties的文件     
  16. //com.test.properties是资源的包名,它跟普通java类的命名规则完全一样:     
  17. //- 区分大小写     
  18. //- 扩展名 .properties 省略。就像对于类可以省略掉 .class扩展名一样     
  19. //- 资源文件必须位于指定包的路径之下(位于所指定的classpath中)     
  20. //另外,对于非西欧字符(比如中日韩文等),需要使用native2ascii命令或类似工具将其转换成ascii码文件格式,否则会显示乱码。     
  21. System.out.println("---Default Locale---");     
  22. ResourceBundle resource = ResourceBundle.getBundle(resourceFile);     
  23.      
  24. testResourceBundle(resource);     
  25.      
  26. System.out.println("---Locale.SIMPLIFIED_CHINESE---");     
  27.      
  28. //创建一个指定Locale(本地化)的ResourceBundle对象,这里指定为Locale.SIMPLIFIED_CHINESE     
  29. //所以ResourceBundle会查找com.test.properties.TestProperties_zh_CN.properties的文件     
  30. //     
  31. //中文相关的Locale有:     
  32. //Locale.SIMPLIFIED_CHINESE : zh_CN     
  33. resource = ResourceBundle.getBundle(resourceFile, Locale.SIMPLIFIED_CHINESE);     
  34. //Locale.CHINA  : zh_CN     
  35. //Locale.CHINESE: zh     
  36. testResourceBundle(resource);     
  37.      
  38. //显示     
  39. //     
  40.     }     
  41.          
  42.     private static void testResourceBundle(ResourceBundle resource) {     
  43. //取得指定关键字的value值     
  44. String userIdLabel = resource.getString("userIdLabel");     
  45. System.out.println(userIdLabel);     
  46.      
  47. //取得所有key值     
  48. Enumeration enu = resource.getKeys();     
  49.      
  50. System.out.println("keys:");     
  51. while(enu.hasMoreElements()) {     
  52.     System.out.println(enu.nextElement());     
  53. }     
  54.     }     
  55. }     
  56. package com.test.properties;  
  57.  
  58. import java.util.Enumeration;  
  59. import java.util.Locale;  
  60. import java.util.ResourceBundle;  
  61.  
  62. public class TestProperties  {  
  63.  
  64.     public static void main(String []args) {  
  65. String resourceFile = "com.test.properties.TestProperties";  
  66. //创建一个默认的ResourceBundle对象  
  67. //ResourceBundle会查找包com.test.properties下的TestProperties.properties的文件  
  68. //com.test.properties是资源的包名,它跟普通java类的命名规则完全一样:  
  69. //- 区分大小写  
  70. //- 扩展名 .properties 省略。就像对于类可以省略掉 .class扩展名一样  
  71. //- 资源文件必须位于指定包的路径之下(位于所指定的classpath中)  
  72. //另外,对于非西欧字符(比如中日韩文等),需要使用native2ascii命令或类似工具将其转换成ascii码文件格式,否则会显示乱码。  
  73. System.out.println("---Default Locale---");  
  74. ResourceBundle resource = ResourceBundle.getBundle(resourceFile);  
  75.  
  76. testResourceBundle(resource);  
  77.  
  78. System.out.println("---Locale.SIMPLIFIED_CHINESE---");  
  79.  
  80. //创建一个指定Locale(本地化)的ResourceBundle对象,这里指定为Locale.SIMPLIFIED_CHINESE  
  81. //所以ResourceBundle会查找com.test.properties.TestProperties_zh_CN.properties的文件  
  82. //  
  83. //中文相关的Locale有:  
  84. //Locale.SIMPLIFIED_CHINESE : zh_CN  
  85. resource = ResourceBundle.getBundle(resourceFile, Locale.SIMPLIFIED_CHINESE);  
  86. //Locale.CHINA  : zh_CN  
  87. //Locale.CHINESE: zh  
  88. testResourceBundle(resource);  
  89.  
  90. //显示  
  91. //  
  92.     }  
  93.       
  94.     private static void testResourceBundle(ResourceBundle resource) {  
  95. //取得指定关键字的value值  
  96. String userIdLabel = resource.getString("userIdLabel");  
  97. System.out.println(userIdLabel);  
  98.  
  99. //取得所有key值  
  100. Enumeration enu = resource.getKeys();  
  101.  
  102. System.out.println("keys:");  
  103. while(enu.hasMoreElements()) {  
  104.     System.out.println(enu.nextElement());  
  105. }  
  106.     }  

解说:

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

【编辑推荐】

  1. Java连接MySQL中文乱码处理
  2. 在Java应用程序中使用Jfreechart配置
  3. Java虚拟机内部构成浅析
  4. 浅谈Java线程的生命周期
  5. 关于Java继承的一些复习

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...