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("四国","四国不存在")); } }
国际化:
国际化程序,说白了,就是多语言对应,根据访问人的地区来选择显示何种语言。
在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, "趙さん")); } }