选择显示字体大小

驯服j2se1.5之从 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=bar
fu=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=baz
foo=bar

the 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 "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"));
 }
}

  关于资源绑定的说明

  虽然 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 "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 解析的更多信息。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons