`

拾遗补缺-ResourceBundle

    博客分类:
  • java
SUN 
阅读更多

http://gceclub.sun.com.cn/Java_Docs/jdk6/html/zh_CN/api/java/util/ResourceBundle.html

ResourceBundle类

ResourceBundle类主要作用是读取属性文件,读取属性文件时可以直接指定属性文件的名称(指定名称时不需要文件的后缀),也可以根据Locale所指定的区域码来选取指定的资源文件,ResourceBundle类的常用方法如表11-4所示。

表11-4  ResourceBundle类的常用方法

序号

   

类型

   

1

public static final ResourceBundle

 getBundle (String baseName)

普通

取得ResourceBundle的实例,

并指定要操作的资源文件名称

2

public static final ResourceBundle

 getBundle (String baseName,Locale locale)

普通

取得ResourceBundle的实例,

并指定要操作的资源文件名称和区域码

3

public final String getString(String key)

普通

根据key从资源文件

中取出对应的value

如果现在要使用ResourceBunlde对象,则肯定直接通过ResourceBundle类中的静态方法getBundle()取得。下面通过一个范例简单介绍ResourceBundle类的使用。

范例:通过ResourceBundle取得资源文件中的内容

(1)定义资源文件:Message.properties

  1. info = HELLO 

(2)从资源文件中取得内容

  1. import java.util.ResourceBundle;  
  2. public class InterDemo01 {  
  3.     public static void main(String[] args) {  
  4.         ResourceBundle rb = ResourceBundle. getBundle("Message") ;// 找到资  
  5. 源文件  
  6.         System.out.println("内容:" + rb. getString("info")) ;// 从资源文件中  
  7. 取得内容  
  8.     }  

程序运行结果:

内容:HELLO

从以上程序中可以发现,程序通过资源文件中的key取得了对应的value。

Java国际化程序实现

11.3.3节中的代码演示了ResourceBundle类的作用,下面就在程序中结合Locale类一起完成一个国际化的程序开发。

下面完成一个简单的国际化操作,可以根据Locale所选择的国家不同,输出不同国家的"你好!"。

中文:你好!

英语:Hello!

法语:Bonjour!

首先根据不同的国家代码建立不同的属性文件,建立的属性文件与生成的*.class保存在同一个文件夹中。因为现在程序要使用的有3种语言,所以要定义3种属性文件,在属性文件定义时必须按照"名称_国家代码"的形式命名,即所有相关的属性文件的名称全部一样,只有国家代码不一样,代码如下所示。

(1)中文的属性文件:Message_zh_CN.properties

  1. info = \u4f60\u597d\uff01 

实际上以上的信息就是中文的"你好!",在属性文件的操作中是不能直接写入中文的,就算是写入了中文,读取出来的也必然是乱码,因此必须将相应的中文变为Unicode编码才可以,要成功地将一个中文编码变为Unicode编码,可以直接在运行处执行"native2ascii.exe"命令,输入相应的中文之后会自动将其进行编码。

(2)英语的属性文件:Message_en_US.properties

  1. info = Hello! 

(3)法语的属性文件:Message_fr_FR.properties

  1. Info = Bonjour!  
  2. 通过Locale类和ResourceBundle类读取属性文件的内容,代码如下。  
  3. import java.util.Locale;  
  4. import java.util.ResourceBundle;  
  5. public class InterDemo02 {  
  6.     public static void main(String[] args) {  
  7.         Locale zhLoc = new Locale("zh""CN");  // 表示中国地区  
  8.         Locale enLoc = new Locale("en""US");  // 表示美国地区  
  9.         Locale frLoc = new Locale("fr""FR");  // 表示法国地区  
  10.         // 找到中文的属性文件  
  11.         ResourceBundle zhrb = ResourceBundle.getBundle("Message",zhLoc) ;  
  12.         // 找到英语的属性文件  
  13.         ResourceBundle enrb = ResourceBundle.getBundle("Message",enLoc) ;  
  14.         // 找到法语的属性文件  
  15.         ResourceBundle frrb = ResourceBundle.getBundle("Message",frLoc) ;  
  16.         // 依次读取各个属性文件的内容,通过键值读取,此时的键值名称为"info"  
  17.         System.out.println("中文:" + zhrb.getString("info")) ;  
  18.         System.out.println("英语:" + enrb.getString("info")) ;  
  19.         System.out.println("法语:" + frrb.getString("info")) ;  
  20.     }  

程序运行结果:

中文:你好!

英语:Hello!

法语:Bonjour!

从以上程序中可以清楚地发现,根据Locale所指定的国家不同,读取的资源文件也不同,这样也就实现了国际化程序。

处理动态文本(1)

在以上程序中,所有资源内容都是固定的,但是输出的消息中如果包含了一些动态文本,则必须使用占位符清楚地表示出动态文本的位置,占位符使用"{编号}"的格式出现。使用占位符之后,程序可以直接通过MessageFormat对信息进行格式化,为占位符动态设置文本的内容。

MessageFormat是Format类的子类,Format类主要实现格式化操作,除了MessageFormat子类外,Format还有NumberFormat、DateFormat两个子类,这两个子类的使用在本章的后面部分均有讲解,读者先来了解MessageFormat类的作用。

U提示:关于Format子类的说明。

在进行国际化操作时,不光只有文字需要处理,实际上数字的显示、日期的显示都要符合各个区域的要求,读者可以通过"区域和语言选项"对话框观察到这一点,如图11-5所示。

 
图11-5  控制面板中的区域和语言选项

在这里要同时改变的有数字、货币、时间等,所以Format类提供了3个子类,即MessageFormat、DateFormat、NumberFormat。

例如,现在要输出的信息(以中文为例)是"你好,xxx!",其中,xxx的内容是由程序动态设置的,所以,此时修改之前的3个属性文件,让其动态地接收程序的3个文本。

(1)中文的属性文件:Message_zh_CN.properties

  1. info = \u4f60\u597d\uff0c{0}\uff01 

以上信息就是中文的"你好,{0}!"。

(2)英语的属性文件:Message_en_US.properties

  1. info = Hello,{0}! 

(3)法语的属性文件:Message_fr_FR.properties

  1. info = Bonjour,{0}! 

在以上3个属性文件中,都加入了"{0}",表示一个占位符,如果有更多的占位符,则直接在后面继续加上"{1}"、"{2}"即可。

然后继续使用之前的Locale类和ResourceBundle类读取资源文件的内容,但是读取之后的文件因为要处理占位符的内容,所以要使用MessageFormat类进行处理,主要使用以下方法:

  1. public static String format(String pattern,Object…arguments) 

以上方法中第1个参数表示要匹配的字符串,第2个参数"Object…arguments"表示输入参数可以任意多个,没有个数的限制。

范例:使用MessageFormat格式化动态文本

  1. import java.text.MessageFormat;  
  2. import java.util.Locale;  
  3. import java.util.ResourceBundle;  
  4. public class InterDemo03 {  
  5.     public static void main(String[] args) {  
  6.         Locale zhLoc = new Locale("zh""CN");  // 表示中国地区  
  7.         Locale enLoc = new Locale("en""US");  // 表示美国地区  
  8.         Locale frLoc = new Locale("fr""FR");  // 表示法国地区  
  9.         // 找到中文的属性文件  
  10.         ResourceBundle zhrb =ResourceBundle.getBundle("Message",zhLoc) ;  
  11.         // 找到英语的属性文件  
  12.         ResourceBundle enrb =ResourceBundle.getBundle("Message",enLoc) ;  
  13.         // 找到法语的属性文件  
  14.         ResourceBundle frrb =ResourceBundle.getBundle("Message",frLoc) ;  
  15.         // 依次读取各个属性文件的内容,通过键值读取,此时的键值名称为"info"  
  16.         String str1 = zhrb.getString("info") ;  
  17.         String str2 = enrb.getString("info") ;  
  18.         String str3 = frrb.getString("info") ;  
  19.         System.out.println("中文:" + MessageFormat.format(str1,"李兴华")) ;  
  20.         System.out.println("英语:" + MessageFormat.format(str2,"LiXingHua")) ;  
  21.         System.out.println("法语:" + MessageFormat.format(str3,"LiXingHua")) ;  
  22.     }  

程序运行结果:

中文:你好,李兴华!

英语:Hello,LiXingHua!

法语:Bonjour,LiXingHua!

以上程序代码通过MessageFormat.format()方法设置动态文本的内容,如果有更多的占位符则可按照图11-6所示设置多个参数。

 
(点击查看大图)图11-6  为多个占位符设置多个动态文本

处理动态文本(2)

U提示:Java新特性--可变参数传递中可以接收多个对象。

在方法传递参数时可以使用如下的形式:

  1. 返回值类型 方法名称(Object…args) 

 

表示方法可以接收任意多个参数,然后按照数组的方式输出即可,代码如下所示。

范例:测试参数传递

  1. public class InterDemo04 {  
  2.     public static void main(String[] args) {  
  3.         System.out.print("第一次运行:");  
  4.         fun("LXH","Li","李兴华") ;         // 传入3个参数  
  5.         System.out.print("\n第二次运行:");  
  6.         fun("MLDN") ;                       // 传入1个参数  
  7.     }  
  8.     public static void fun(Object...args){  //  可以输入任意多个数据,使用数组  
  9. 表示  
  10.         for(int i=0;i<args.length;i++){  
  11.             System.out.print(args[i] + "、");  
  12.         }  
  13.     }  

程序运行结果:

第一次运行:LXH、Li、李兴华、

第二次运行:MLDN、

从程序的运行结果中可以发现,无论在方法调用时输入多少个参数,方法都可以接收,接收参数之后可以直接以数组的形式对参数进行输出。

在其他的资料中读者也可能看到使用数组的方式向可变参数传递内容,代码如下所示。

范例:使用数组传递参数

  1. package org.lxh.demo11.interdemo;  
  2. public class InterDemo05 {  
  3.     public static void main(String[] args) {  
  4.         System.out.print("第一次运行:");  
  5.         Object[] arg1 = {"LXH","Li","李兴华"} ;    // 对象数组,保存所有具体内容  
  6.         fun(arg1) ;                             // 传入3个参数  
  7.         System.out.print("\n第二次运行:");  
  8.         Object[] arg2 = {"MLDN"} ;  
  9.         fun(arg2) ;                             // 传入1个参数  
  10.         System.out.print("\n第三次运行:");  
  11.         Object[] arg3 = {} ;  
  12.         fun(arg3) ;                             // 没有参数传入  
  13.     }  
  14.     public static void fun(Object...args){      // 可变参数  
  15.         for(int i=0;i<args.length;i++){  
  16.             System.out.print(args[i] + "、");  
  17.         }  
  18.     }  

程序运行结果:

第一次运行:LXH、Li、李兴华、

第二次运行:MLDN、

第三次运行:

从运行结果来看,两种方式是一样的,没有任何的区别,读者可以根据个人喜好来选择,并没有强制性的规定。

分享到:
评论

相关推荐

    国际化插件-ResourceBundle Editor

    国际化插件——ResourceBundle Editor是专门用于处理Java应用程序中国际化(i18n)资源管理的工具。在软件开发过程中,为了使应用能够适应不同语言和文化环境,开发者通常会使用ResourceBundle,这是一个Java类库,...

    php-icu-resourcebundle:ICU 资源包的 PHP 实现,可直接处理 .txt 文件(无需使用 genrb)

    开发它是为了简化创建 ResourceBundle 源的过程,而不必每次使用 genrb 重新编译源文件。 这个项目既不是真正的一部分,也不是。 用法 : 测试文件 &lt;?php use Adoy \ ICU \ ResourceBundle \ ResourceBundle ;...

    Xml ResourceBundle简单实现

    Xml ResourceBundle是一种在Java编程语言中处理国际化(i18n)和本地化(l10n)资源的方式。它允许开发者以XML格式存储各种语言版本的文本字符串和其他资源,便于程序根据用户所在的区域或首选语言提供相应的内容。...

    j18n - Java ResourceBundle I18N-开源

    j18n替代了java.util.ResourceBundle以支持Unicode属性文件。 您可以将UTF8字符放入* .properties中,唯一的代码更改是将“ ResourceBundle.getBundle(..)”替换为“ J18n.getBundle(..)”。

    ResourceBundle与Properties读取maven中resources目录下的资源文件

    ### ResourceBundle与Properties读取Maven中Resources目录下的资源文件 #### 一、概述 在Java开发过程中,我们经常需要读取资源文件中的配置信息。在Maven项目中,`src/main/resources`目录下通常存放了各种配置...

    ResourceBundle

    ResourceBundle Editor (eclipse-rbe)是一个用于编辑本地化的属性文件(localized properties files)。它让你通一个屏幕就能够同时管理所有相关联属性文件中的key/value信息。它所具有的功能包括:自动为Keys分类,...

    ResourceBundle:资源包,包括图片源代码-源码包

    在这个名为 "ResourceBundle:资源包,包括图片源代码-源码包" 的压缩包中,我们很可能会找到一个名为 `ResourceBundle-master` 的项目,它可能包含了如何使用 `ResourceBundle` 类来管理和使用资源,特别是与图像...

    struts_2.3.12GA_API文档(chm版本)

    ResourceBundle getTexts(String aBundleName) Get the named bundle, such as "com/acme/Foo". boolean hasActionErrors() Check whether there are any Action-level error messages. boolean ...

    信息绑定ResourceBundle

    在Java编程中,资源绑定(ResourceBundle)是一种管理国际化和本地化资源的重要机制。它允许开发者将应用程序中的文本、消息和配置信息与特定的语言环境或区域设置分离开来,以便于维护和更新。本文将深入探讨“信息...

    java.util.ResourceBundle使用详解

    java.util.ResourceBundle使用详解

    ResourceBundleEditor_v0.7.5 eclipes国际化插件

    这款工具不仅提供了便捷的方式来编辑和管理`ResourceBundle`文件,还支持多种语言之间的转换,使得开发者可以更加高效地进行国际化工作。 首先,让我们深入了解`ResourceBundle`的概念。在Java中,`ResourceBundle`...

    ResourceBundle类在jsp中的国际化实现方法

    `ResourceBundle`类是Java提供的一个标准工具,用于存储和管理不同语言环境下的文本资源。在JSP(JavaServer Pages)中,我们可以利用`ResourceBundle`来实现页面的国际化。下面将详细介绍`ResourceBundle`类的使用...

    JavaSwingQQ.rar

    - ResourceBundle:支持不同语言的文本资源,实现应用的多语言支持。 9. **设计模式**: - MVC(模型-视图-控制器):Swing应用程序常采用的设计模式,分离业务逻辑、用户界面和数据模型。 以上是使用Java Swing...

    Java日历记事本!!!!

    - ResourceBundle和Locale:支持多种语言的用户界面,使应用程序能适应不同地区的用户。 10. **测试与调试** - 单元测试:使用JUnit或其他测试框架确保代码功能正确。 - 调试工具:Eclipse或IntelliJ IDEA等IDE...

    java拦截器_类型转换_国际化

    在Java中,国际化通常通过ResourceBundle类来实现,它可以加载不同语言版本的资源配置文件。资源文件包含了应用中的字符串、数字和其他可变内容,通过指定用户所在的区域设置,程序可以动态地选择并显示相应的语言...

    高手总结java常用API(免费下载).pdf

    - ResourceBundle 用于国际化和本地化,加载不同语言环境下的资源文件。 - Properties 类用于存储和加载配置属性文件,通常用于存储应用程序的配置信息。 9. **Exceptions** - Java 异常处理机制使用 try-catch-...

    使用J2SE API读取Properties文件的六种方法

    ResourceBundle rb = ResourceBundle.getBundle(name, Locale.getDefault()); ``` 这个方法通常用于处理不同语言环境下的资源配置。 3. **使用java.util.PropertyResourceBundle类的构造函数** 如果你直接需要...

    ResourceBundle:有助于开发 REST API 的 Symfony 包

    ResourceBundle 是一个固执的 Symfony 包,用于帮助开发 REST API。 它为您做出一些架构决策,使您能够更多地关注应用程序的领域。 它使用尽可能少的魔法,使其更易于理解、调试和扩展。 ##Prerequisites ...

Global site tag (gtag.js) - Google Analytics