Java操作属性文件与国际化

  在前面讲到的java类集中的Hashtable中,有一个子类Properties,此类定义如下:

  public class Properties extends Hashtable<Object,Object>

  该类表示了一个持久的属性集。Properties可保存在流中或从流中加载。属性列表每个键及其对应的值都是一个字符串。

常用方法:

1. String getProperty(String key) 用指定的键在此属性列表中搜索属性
2. String getProperty(String key,Sting defaultValue) 用指定的键在此属性列表中搜索属性
3. void list(PringStream out) 将属性列表输出到指定的输出流
4. void list(PrintWriter out) 将属性列表输出到指定的输出流
5. void load(InputStrean is) 从输入流中读取属性列表
6. void load(Reader reader) 按简单的面向行的格式从输入字符流中读取
7. void loadFromXML(InputStream in) 将指定输入流中由XML文档所表示的书友属性加载到此属性列表
8. Object setProperty(String key,String value) 调用hashtable的方法put
9. void store(OutputStream out,String comments) 将属性列表写入输出流
10. void store(Writer writer,String comments) 将属性列表写入输出字符流
11. void storeToXML(OutputStream os,String comment) 发出一个表示此表中包含的所有属性的XML文档

 

 

 

 

 

 

 

 

 

 

 

 

.

 

实例

package com.fuwh.property;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

public class PropertyTest01 {
    public static void main(String[] args) {
        //定义一个属性操作类
        Properties property=new Properties();
        property.setProperty("魏", "曹操");
        property.setProperty("蜀", "刘备");
        property.setProperty("吴", "孙权");
        System.out.println("属性存在:"+property.getProperty("魏","假曹操"));
        System.out.println("属性存在:"+property.getProperty("蜀国","假刘备"));
        
        //将此属性保存在一个属性文件中(sanguo.properties)
        System.out.println("*** 写入属性文件 ***");
        try {
            property.store(new FileOutputStream(new File("sanguo.properties")), "三国争霸");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        System.out.println("*** 从属性文件中读取 ***");
        Properties readFromProperties=new Properties();
        try {
            readFromProperties.load(new FileInputStream("sanguo.properties"));
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("三国:"+readFromProperties.getProperty("三国"));
        System.out.println("魏:"+readFromProperties.getProperty("魏"));
        System.out.println("四国:"+readFromProperties.getProperty("四国","四国不存在"));
        
        System.out.println("*** 写入XML文件 ***");
        try {
            property.storeToXML(new FileOutputStream(new File("sanguo.xml")), "三国");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("*** 从XML文件中读取 ***");
        Properties readFromXML=new Properties();
        try {
            readFromXML.load(new FileInputStream("sanguo.properties"));
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("三国:"+readFromXML.getProperty("三国"));
        System.out.println("蜀:"+readFromXML.getProperty("蜀"));
        System.out.println("四国:"+readFromXML.getProperty("四国","四国不存在"));
        
        
    }
}
View Code

 

 国际化

   国际化程序,说白了,就是多语言对应,根据访问人的地区来选择显示何种语言。

   在Java中,要实现国际化,需要使用到的类是:Local,ResourceBoundle,MessageFormat几个类。 

Local

类的定义如下:

  public final class Local extends Object implements Cloneable,Serializable

构造方法:

  Local(String language):根据语言代码构造一个语言环境

  Local(String language,String country):根据语言和国家/地区构造一个语言环境

  Local(String language,String country,String variant):根据语言、国家/地区和变量构造一个语言环境

  Local对象表示了特定的地理、政治和文化地区。语言参数是一个有效的ISO语言代码,这些代码是由 ISO-639 定义的小写两字母代码。在许多网站上都可以找到这些代码的完整列表,如:
http://www.loc.gov/standards/iso639-2/englangn.html。

国家/地区参数是一个有效的 ISO 国家/地区代码。这些代码是由 ISO-3166 定义的大写两字母代码。在许多网站上都可以找到这些代码的完整列表,如:
http://www.iso.ch/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html。

  我们也可以在浏览器中找到,例如:

  

  前面两位小写的就是ISO语言代码,后面两位大写的就是国家代码。

  在Local类中提供了很多常量,可以很方便的创建Local对象。

ResourceBundle

类的定义如下:

  public abstract class ResourceBundle extends Object

  可以发现,这是一个抽象类。可以通过类中的getBundle方法来获取ResourceBundle对象。

  资源包包含特定与语言环境的对线个,当程序需要一个特定与语言环境的资源时,程序可以从适合当前用户语言环境的资源包中加载它,使用这种方式可以实现国际化。

  在定义资源文件的时候,必须要采取 文件名_ISO语言代码_ISO国家地区代码 的格式。

MessageFormat:

类的定义如下:

  public class MessageFormat extends Format

这个类继承自Format类,提供了对消息的一些格式化,在Format类中,还有DateFormat,NumberFormat等子类,分别提供对日期和数字的格式化。

主要方法:

  static String format(String pattern,Object... arguments)

 

实例

 

package com.fuwh.intel;

import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;

public class IntelTest01 {
    public static void main(String[] args) {
        Locale china=new Locale("zh","CN");
        Locale japan=new Locale("ja","JP");
        ResourceBundle rbChina=ResourceBundle.getBundle("welcome",china);
        ResourceBundle rbJapan=ResourceBundle.getBundle("welcome",japan);
        String str1=rbChina.getString("welcomeMessage");
        String str2=rbJapan.getString("welcomeMessage");
        System.out.println("中文:"+MessageFormat.format(str1, "张三"));
        System.out.println("日文:"+MessageFormat.format(str2, "趙さん"));
    }
}
View Code

 

posted @ 2017-02-26 20:05  Ouka傅  阅读(309)  评论(0编辑  收藏  举报