1.5之前的J2SE版本要求您直接使用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
)和两个值( bar
表示foo
, baz
表示fu
)。 该类支持将\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
子类),因此不保证顺序。
清单3. LoadSample的输出
-- listing properties --
fu=baz
foo=bar
The foo property: bar
XML属性文件
这些都不是新手。 这是Properties
类始终起作用的方式。 但是,新功能是可以从XML文件加载一组属性的选项。 清单4显示了它的DTD。
清单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>
标签,都有一个key属性,条目的内容为其值。 清单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所示,读取Properties
文件的XML版本与读取旧样式格式没有太大区别。
清单6.读取XML属性文件
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所示。
保存XML属性
新“ Properties
功能的另一面是将属性存储到XML格式的文件中。 尽管store()
方法仍将创建清单1所示的文件,但是您现在可以使用新的storeToXML()
方法创建清单5所示的文件。 只需传递一个OutputStream
和一个String
作为注释,就可以完成。 清单7演示了新的storeToXML()
方法。
清单7.将属性存储为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();
}
}
清单8显示了运行清单7中的程序所产生的输出。
清单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
对象。 选择完全取决于您。 检查程序包专用XMLUtils
类的源,以获取有关使用的XML解析的其他信息。
翻译自: https://www.ibm.com/developerworks/java/library/j-tiger02254/index.html