关于Java常用工具您不知道的5件事

发表于:2010-12-09 10:59

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

#
java
#
JAVA
#
Java

  很多年前,当我还是高中生的时候,我曾考虑以小说作家作为我的职业追求,我订阅了一本 Writer's Digest 杂志。我记得其中有篇专栏文章,是关于 “太小而难以保存的线头”,专栏作者描述厨房储物抽屉中放满了无法分类的玩意儿。这句话我一直铭记在心,它正好用来描述本文的内容,本系列的最后一篇(至少目前是这样)。

  Java 平台就充满了这样的 “线头” — 有用的命令行工具和库,大多数 Java 开发人员甚至都不知道,更别提使用了。其中很多无法划分到之前的 5 件事 系列 的编程分类中,但不管怎样,尝试一下:有些说不定会在您编程的厨房抽屉中占得一席之地。

  1. StAX

  在千禧年左右,当 XML 第一次出现在很多 Java 开发人员面前时,有两种基本的解析 XML 文件的方法。SAX 解析器实际是由程序员对事件调用一系列回调方法的大型状态机。DOM 解析器将整个 XML 文档加入内存,并切割成离散的对象,它们连接在一起形成一个树。该树描述了文档的整个 XML Infoset 表示法。这两个解析器都有缺点:SAX 太低级,无法使用,DOM 代价太大,尤其对于大的 XML 文件 — 整个树成了一个庞然大物。

  幸运的是,Java 开发人员找到第三种方法来解析 XML 文件,通过对文档建模成 “节点”,它们可以从文档流中一次取出一个,检查,然后处理或丢弃。这些 “节点” 的 “流” 提供了 SAX 和 DOM 的中间地带,名为 “Streaming API for XML”,或者叫做StAX。(此缩写用于区分新的 API 与原来的 SAX 解析器,它与此同名。)StAX 解析器后来包装到了 JDK 中,在 javax.xml.stream 包。

  使用 StAX 相当简单:实例化 XMLEventReader,将它指向一个格式良好的 XML 文件,然后一次 “拉出” 一个节点(通常用 while 循环),查看。例如,在清单 1 中,列举出了 Ant 构造脚本中的所有目标:

  清单 1. 只是让 StAX 指向目标

import java.io.*;
import javax.xml.namespace.QName;
import javax.xml.stream.
*;
import javax.xml.stream.events.
*;
import javax.xml.stream.util.
*;

publicclass Targets
{
    
publicstatic void main(String[] args)
        throws Exception
    {
        
for(Stringarg : args)
        {
            XMLEventReader xsr
=
                XMLInputFactory.newInstance()
                    .createXMLEventReader(
newFileReader(arg));
            
while(xsr.hasNext())
            {
                XMLEvent evt
=xsr.nextEvent();
                switch (evt.getEventType())
                {
                    
caseXMLEvent.START_ELEMENT:
                    {
                        StartElement se
=evt.asStartElement();
                        
if(se.getName().getLocalPart().equals("target"))
                        {
                            Attribute targetName
=
                                se.getAttributeByName(
newQName("name"));
                            
//Found a target!
                            System.out.println(targetName.getValue());
                        }
                        break;
                    }
                    
//Ignore everythingelse
                }
            }
        }
    }
}

  StAX 解析器不会替换所有的 SAX 和 DOM 代码。但肯定会让某些任务容易些。尤其对完成不需要知道 XML 文档整个树结构的任务相当方便。

  请注意,如果事件对象级别太高,无法使用,StAX 也有一个低级 API 在 XMLStreamReader 中。尽管也许没有阅读器有用,StAX 还有一个 XMLEventWriter,同样,还有一个 XMLStreamWriter 类用于 XML 输出。

51/512345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号