美文网首页Java基础
Java平台的,Local对象,ResourceBundle对象

Java平台的,Local对象,ResourceBundle对象

作者: Alex_1799 | 来源:发表于2018-03-16 11:18 被阅读0次

一套有实效的软件系统也要考虑用户的语言和地理区域,语言和区域形成了本地环境,描述了软件本地化的配置和上下文,再Java平台上,通过Java.util.Locale对象来描述本地化。

Java.util.Locale

如下代码会一句这些设置的属性来打印出local

import java.util.Locale;

public class Default{

  public static void main(String args[]){

    System.out.println(Locale.getDefault());

}

根据如上代码来做个试验,运行在U.S的英语系统时候,该代码会输出en_US





如何用ResourceBundle来读取配置文件


Locale locale = new Locale("en", "US");  

ResourceBundle labels = ResourceBundle.getBundle("i18n.MyBundle", locale); 

 System.out.println(labels.getString("label1"));  

上面的例子中,你需要将MyBundle放在包i18n中。 resource bundle 的名称类似类名。如i18n.MyBundle意思是,包i18n中的属性文件MyBundle.properties。

下面是属性文件中的内容。

label1 = Label 1 is done!  

label2 = Label 2 is through!  

上述文件是由一组key,value对构成。key在=号左侧,value在右侧。value是你要本地化的内容。

对于java基础很好的人来说,这个应该是简单的不能再简单的了。不过估计一些java新手不一定会知道(比如我,上次为别人写一个东西,需要从外存读文件来设置对象的值,因为不知道有ResourceBundle这种东西,就自己用FileReader在那搞,折腾了半天,最后还不能把配置文件和jar包打在一起发布,郁闷)。

java.util.ResourceBundle

ResourceBundle的类层次结构

ResourceBundle类有两个子类,PropertyResourceBundle及ListResourceBundle。下面是这几个类的结构图。


PropertyResourceBundle将本地化的文本存储于Java property文件中

创建ResourceBundle

//basename为本地语言配置文件名 

public static final ResourceBundle getBundle(String basename,Locale locale); 

可以按照下面方式,创建ResourceBundle类的实例

//建立本地语言对象

Locale locale=new Locale("en","US");

//把本地语言对象作为参数,传给ResourceBundle对象

ResourceRundle lables=ResourceBundle.getBundle("本地语言配置的文件名",locale);

System.out.println(lables.getString(“xx”));             //打印结果为这个键所对应的配置值


首先要创建Locale实例,然后将Locale实例传给ResourceBundle.getBundle(String basename,Locale locale)方法,

此外还需要传递加载的resource bundle名称,最后用过ResourceBundle的getString()方法,getObjec()方法访问本地化值。

实际上并没有创建ResourceBundle实例,而是创建了ResourceBundle子类的实例,实例创建都是通过工厂方法来完成,首先ResourceBundle类将会查找ListResourceBundle,随后会查找PropertyResourceBundle。查找是根据ListResourceBundle类名来匹配resource bundle的名字来完成(getBundle()方法的第一个参数),如果找不到,则根据PropertyResourceBundle resource bundle来匹配。


Property Files作为ResourceBundle

可以使用标准的属性文件来存储本地化文本。可以通过ResourceBundle 类加载这些属性。

Locale locale = new Locale("en", "US");  

ResourceBundle labels = ResourceBundle.getBundle("i18n.MyBundle", locale);  

System.out.println(labels.getString("label1"));  

上面的例子中,你需要将MyBundle放在包i18n中。 resource bundle 的名称类似类名。如i18n.MyBundle意思是,包i18n中的属性文件MyBundle.properties。

下面是属性文件中的内容。

label1 = Label 1 is done!  

label2 = Label 2 is through!  

上述文件是由一组key,value对构成。key在=号左侧,value在右侧。value是你要本地化的内容。


将不同语言,放置于不同的属性文件中

为了提供不同语言的字符串,需要为每种语言创建属性文件,文件名的格式为 xxxx_语言编码。例如:

MyBundle.properties  

MyBundle_da.properties  

MyBundle_de.properties  

MyBundle_fr.properties  


这些文件应该放在同一个包中。

没有语言后缀的文件(例如:MyBundle.properties)是默认的属性文件。

带有语言编码后缀的属性文件包含同样的key但是value是以不同的语言来标识。如danish  属性文件:

label1 = Label 1 er klar! 

 label2 = Label 2 er igennem!  


将类作为ResourceBundle

也可以使用一组类来获取资源,使用类,还可以使用除字符串值外的其它类型资源。

与属性文件类似,可以创建带有 bundle base名称与语言后缀的一组类。

例如:

i18n.MyClassBundle

i18n.MyClassBundle_da

i18n.MyClassBundle_en

i18n.MyClassBundle_de

下面是一个默认的bundle class文件实现的例子。

import java.util.ListResourceBundle;  

public class MyClassBundle extends ListResourceBundle {  

@Override  

protected Object[ ][ ] getContents() {  

return contents;  

    }  

private Object[ ][ ] contents = {  

{"price"   , new Double(10.00) },  

{"currency", "EUR" },  

    };  

}  


下面是danish(丹麦语)  resource bundle的实现。

public class MyClassBundle_da extends ListResourceBundle {  

@Override  

protected Object[][] getContents() {  

return contents;  

    }  

private Object[][] contents = {  

{"price"   , new Double(75.00) },  

{"currency", "DKK" },  

    };  

}  


注意contents数组,是一个包含key,value的二维数组。price,currency是key,而key右侧为本地化的值。获取ListResourceBundle 实例的方式与获取PropertyResourceBundle实例的方式一样,下面是获取默认ResourceBundle 及丹麦语ResourceBundle 的例子。

//获取德国

Locale locale = new Locale("de", "DE"); //no bundle for German -> default  

ResourceBundle bundle = ResourceBundle.getBundle("i18n.MyClassBundle", locale);  

System.out.println("price   : " + bundle.getObject("price"));  

System.out.println("currency: " + bundle.getObject("currency"));  

//获取丹麦

locale =new Locale("da", "DK");  

bundle = ResourceBundle.getBundle("i18n.MyClassBundle", locale);  

System.out.println("price   : " + bundle.getObject("price"));  

System.out.println("currency: " + bundle.getObject("currency"));  

输出是:  

price   :10.0  

currency: EUR  

price   :75.0  

currency: DKK  


从ResourceBundle中获取值

获取ResourceBundle实例后可以通过下面的方法获得本地化值。

getObject(String key);

getString(String key);

getStringArray(String key);

还可以通过keySet()方法获取所有的key。Set keys = bundle.keySet();

其它ResourceBundle 方法可以通过查看文档获得。

相关文章

  • Java平台的,Local对象,ResourceBundle对象

    一套有实效的软件系统也要考虑用户的语言和地理区域,语言和区域形成了本地环境,描述了软件本地化的配置和上下文,再Ja...

  • Java 多线程详解

    线程对象是可以产生线程的对象。比如在 Java 平台中 Thread 对象 、Runnable 对象。线程,是指正...

  • Java的基本概念-1

    JAVA介绍 面向对象程序和java平台总称不使用指针,使用引用支持多线程 Java基础语法 对象:类的实例,分为...

  • Java序列化+复制

    JAVA 序列化(创建可复用的Java对象) 保存(持久化)对象及其状态到内存或者磁盘 Java 平台允许我们在内...

  • JAVA知识泛泛总结

    @(Java) 面向对象编程期末考复习笔记 了解Java Java具有面向对象、与平台(由系统OS和处理器CPU构...

  • Hello, Java!

    Java概述 Java是一种可用于编写跨平台应用的面向对象的编程语言。 Java具有简单、面向对象、分布式、解释型...

  • Java编程基础八股文

    Java语言具有哪些特点? Java为纯面向对象的语言。它能够直接反应现实生活中的对象。 具有平台无关性。java...

  • Java中获取资源文件三种方式

    获取资源文件有三种方式 采用 ServletContext对象获取 采用ResourceBundle类来获取 采用...

  • JVM内存结构 - Java内存模型 - Java对象模型

    Java的内存结构,内存模型,对象模型 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点...

  • Java锁的原理

    引子 上锁就是改变对象的对象头?什么是对象头?----Java对象的布局----Java对象由什么组成----对象...

网友评论

    本文标题:Java平台的,Local对象,ResourceBundle对象

    本文链接:https://www.haomeiwen.com/subject/fsnzfftx.html