下载本文示例代码
Properties 类已不是新东西了,它在 Java 编程的早期就有了,并且几乎没有什么变化。J2SE 的 Tiger 版本增强了这个类,不仅可以用它在单独一行中指定用等号分隔的多个键-值对,还可以用XML 文件装载和保存这些键-值对。在 驯服 Tiger的系列文章中,John Zukowski 展示了如何驾驭这匹新一代的“役马”。 J2SE 1.5 以前的版本要求直接使用 XML 解析器来装载配置文件并存储设置。虽然这并非是一件困难的事情,并且解析器是平台的标准部分,但是额外的工作总是有点让人烦。最近更新的 java.util.Properties 类现在提供了一种为程序装载和存储设置的更容易的方法: loadFromXML(InputStream is) 和 storeToXML(OutputStream os, String comment) 方法。 Properties 基本知识 如果不熟悉 java.util.Properties 类,那么现在告诉您它是用来在一个文件中存储键-值对的,其中键和值是用等号分隔的,如清单 1 所示。 清单 1. 一组属性示例
foo=barfu=baz 将清单 1 装载到 Properties 对象中后,您就可以找到两个键( foo 和 fu )和两个值( foo 的 bar 和 fu 的 baz )了。这个类支持带 \u 的嵌入 Unicode 字符串,但是这里重要的是每一项内容都当作 String 。 现在有了 J2SE 1.5 Beta 1 清单 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=bazfoo=barThe foo property: bar XML 属性文件 这里没有什么新内容。 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 ""><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")); }} 关于资源绑定的说明 虽然 java.util.Properties 类现在除了支持键-值对,还支持属性文件作为 XML 文件,不幸的是,没有内置的选项可以将 ResourceBundle 作为一个 XML 文件处理。是的, PropertyResourceBundle 不使用 Properties 对象来装载绑定,不过装载方法的使用是硬编码到类中的,而不使用较新的 loadFromXML() 方法。 运行清单 6 中的程序产生与原来的程序相同的输出,如 清单 2所示。 保存 XML 属性 新的 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 ""><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 解析的更多信息。
Properties 类已不是新东西了,它在 Java 编程的早期就有了,并且几乎没有什么变化。J2SE 的 Tiger 版本增强了这个类,不仅可以用它在单独一行中指定用等号分隔的多个键-值对,还可以用XML 文件装载和保存这些键-值对。在 驯服 Tiger的系列文章中,John Zukowski 展示了如何驾驭这匹新一代的“役马”。 J2SE 1.5 以前的版本要求直接使用 XML 解析器来装载配置文件并存储设置。虽然这并非是一件困难的事情,并且解析器是平台的标准部分,但是额外的工作总是有点让人烦。最近更新的 java.util.Properties 类现在提供了一种为程序装载和存储设置的更容易的方法: loadFromXML(InputStream is) 和 storeToXML(OutputStream os, String comment) 方法。 Properties 基本知识 如果不熟悉 java.util.Properties 类,那么现在告诉您它是用来在一个文件中存储键-值对的,其中键和值是用等号分隔的,如清单 1 所示。 清单 1. 一组属性示例
foo=barfu=baz 将清单 1 装载到 Properties 对象中后,您就可以找到两个键( foo 和 fu )和两个值( foo 的 bar 和 fu 的 baz )了。这个类支持带 \u 的嵌入 Unicode 字符串,但是这里重要的是每一项内容都当作 String 。 现在有了 J2SE 1.5 Beta 1 清单 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=bazfoo=barThe foo property: bar XML 属性文件 这里没有什么新内容。 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 ""><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")); }} 关于资源绑定的说明 虽然 java.util.Properties 类现在除了支持键-值对,还支持属性文件作为 XML 文件,不幸的是,没有内置的选项可以将 ResourceBundle 作为一个 XML 文件处理。是的, PropertyResourceBundle 不使用 Properties 对象来装载绑定,不过装载方法的使用是硬编码到类中的,而不使用较新的 loadFromXML() 方法。 运行清单 6 中的程序产生与原来的程序相同的输出,如 清单 2所示。 保存 XML 属性 新的 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 ""><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 解析的更多信息。
下载本文示例代码
驯服J2SE1.5之从 XML 中装载属性驯服J2SE1.5之从 XML 中装载属性驯服J2SE1.5之从 XML 中装载属性驯服J2SE1.5之从 XML 中装载属性驯服J2SE1.5之从 XML 中装载属性驯服J2SE1.5之从 XML 中装载属性驯服J2SE1.5之从 XML 中装载属性驯服J2SE1.5之从 XML 中装载属性驯服J2SE1.5之从 XML 中装载属性驯服J2SE1.5之从 XML 中装载属性驯服J2SE1.5之从 XML 中装载属性驯服J2SE1.5之从 XML 中装载属性驯服J2SE1.5之从 XML 中装载属性驯服J2SE1.5之从 XML 中装载属性驯服J2SE1.5之从 XML 中装载属性
阅读(172) | 评论(0) | 转发(0) |