J2SE 1.5 以前的版本要求直接使用 XML 解析器来装载配置文件并存储设置。虽然这并非是一件困难的事情,并且解析器是平台的标准部分,但是额外的工作总是有点让人烦。最近更新的
java.util.Properties 类现在提供了一种为程序装载和存储设置的更容易的方法:
loadFromXML(InputStream is) 和
storeToXML(OutputStream os, String comment) 方法。
如果不熟悉
java.util.Properties 类,那么现在告诉您它是用来在一个文件中存储键-值对的,其中键和值是用等号分隔的,如清单 1 所示。
清单 1. 一组属性示例
foo=bar fu=baz |
将清单 1 装载到
Properties 对象中后,您就可以找到两个键(
foo 和
fu )和两个值(
foo 的
bar 和
fu
的
baz )了。这个类支持带
\u 的嵌入 Unicode 字符串,但是这里重要的是每一项内容都当作
String 。
清单 2 显示了如何装载属性文件并列出它当前的一组键和值。只需传递这个文件的
InputStream 给
load() 方法,就会将每一个键-值对添加到
Properties 实例中。然后用
list()
列出所有属性或者用
getProperty() 获取单独的属性。
清单 2. 装载属性
import java.util.*;
import java.io.*;
public class LoadSample {
public static void main(String args[]) throws Exception {
Properties prop = new Properties();
FileInputStream fis =
new FileInputStream("sample.properties");
prop.load(fis);
prop.list(System.out);
System.out.println("\nThe foo property: " +
prop.getProperty("foo"));
}
}
|
运行 LoadSample 程序生成如清单 3 所示的输出。注意
list() 方法的输出中键-值对的顺序与它们在输入文件中的顺序不一样。
Properties 类在一个散列表(hashtable,事实上是一个
Hashtable 子类)中储存一组键-值对,所以不能保证顺序。
清单 3. LoadSample 的输出
-- listing properties -- fu=baz foo=bar The foo property: bar |
这里没有什么新内容。
Properties 类总是这样工作的。不过,新的地方是从一个 XML 文件中装载一组属性。它的 DTD 如清单 4 所示。
清单 4. 属性 DTD
<?xml version="1.0" encoding="UTF-8"?> <!-- DTD for properties --> <!ELEMENT properties ( comment?, entry* ) > <!ATTLIST properties version CDATA #FIXED "1.0"> <!ELEMENT comment (#PCDATA) > <!ELEMENT entry (#PCDATA) > <!ATTLIST entry key CDATA #REQUIRED> |
如果不想细读 XML DTD,那么可以告诉您它其实就是说在外围
<properties> 标签中包装的是一个
<comment> 标签,后面是任意数量的
<entry> 标签。对每一个
<entry> 标签,有一个键属性,输入的内容就是它的值。清单 5 显示了
清单
1中的属性文件的 XML 版本是什么样子的。
清单 5. XML 版本的属性文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>Hi</comment> <entry key="foo">bar</entry> <entry key="fu">baz</entry> </properties> |
如果清单 6 所示,读取 XML 版本的
Properties 文件与读取老格式的文件没什么不同。
清单 6. 读取 XML Properties 文件
import java.util.*;
import java.io.*;
public class LoadSampleXML {
public static void main(String args[]) throws Exception {
Properties prop = new Properties();
FileInputStream fis =
new FileInputStream("sampleprops.xml");
prop.loadFromXML(fis);
prop.list(System.out);
System.out.println("\nThe foo property: " +
prop.getProperty("foo"));
}
}
|
运行清单 6 中的程序产生与原来的程序相同的输出,如 清单 2所示。
新的
Properties 还有一个功能是将属性存储到 XML 格式的文件中。虽然
store()
方法仍然会创建一个类似
清单
1 所示的文件,但是现在可以用新的
storeToXML() 方法创建如
清单
5 所示的文件。只要传递一个
OutputStream 和一个用于注释的
String
就可以了。清单 7 展示了新的
storeToXML() 方法。
清单 7. 将 Properties 存储为 XML 文件
import java.util.*;
import java.io.*;
public class StoreXML {
public static void main(String args[]) throws Exception {
Properties prop = new Properties();
prop.setProperty("one-two", "buckle my shoe");
prop.setProperty("three-four", "shut the door");
prop.setProperty("five-six", "pick up sticks");
prop.setProperty("seven-eight", "lay them straight");
prop.setProperty("nine-ten", "a big, fat hen");
FileOutputStream fos =
new FileOutputStream("rhyme.xml");
prop.storeToXML(fos, "Rhyme");
fos.close();
}
}
|
运行清单 7 中的程序产生的输出如清单 8 所示。
清单 8. 存储的 XML 文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>Rhyme</comment> <entry key="seven-eight">lay them straight</entry> <entry key="five-six">pick up sticks</entry> <entry key="nine-ten">a big, fat hen</entry> <entry key="three-four">shut the door</entry> <entry key="one-two">buckle my shoe</entry> </properties> |
使用 XML 文件还是使用老式的 a=b 类型的文件完全取决于您自己。老式文件从内存的角度看肯定是轻量级的。不过,由于 XML 的普遍使用,人们会期望 XML 格式流行起来,因为它已经被广泛使用了,只不过没有用到
Properties 对象。选择完全在您。分析软件包 private
XMLUtils 类的源代码以获得关于所使用的 XML 解析的更多信息。
- 您可以参阅本文在 developerWorks 全球站点上的
英文原文.
- 从 Sun 开发者网络下载
J2SE
1.5 Beta 1。
- 下载本文中用到的
源代码示例。
- 阅读 1.5.0 的
Properties
类的 javadoc。
- 从 Eric A. Olson 的“
在 PropertyResourceBundles 中引入继承”(
developerWorks,2001
年 5 月)中学习更多关于资源绑定的内容。
- 就像 Properties 类一样,不需要直接使用 SAX 和 DOM。从 Uche Ogbuji 的“
Tip:
Use language-specific tools for XML processing”(
developerWorks,2004
年 1 月)中学习其他的方法。
- 用
JSR
176分析 Tiger (J2SE 1.5) 的进步。
- 通过
j2se-beta-feedback@sun.com
用电子邮件向 Sun 报告 bug。
- 阅读 John Zukowski 的全部
驯服
Tiger
系列技巧。如果仍然使用 J2SE 1.4,那么还应该阅读
Merlin
的魔力
系列。
- 在
developerWorks
Java 技术专区
可以找到数百篇关于 Java 技术各个方面的文章。
- 访问
Developer
Bookstore,获得技术图书的完整列表,其中包括数百本与 Java 相关的图书。

John Zukowski 为 JZ Ventures, Inc.做战略性 Java 咨询,并与 SavaJe Technologies合作开发下一代移动电话平台。他最近的著作有 Mastering Java 2, J2SE 1.4 (Sybex,2002 年 4 月)和 Learn Java with JBuilder 6 (Apress,2002 年 3 月)。可通过 jaz@zukowski.net与 John 联系。