Woodstox 是 Java 中高性能、稳定的 StAX 实现,优于 JDK 自带解析器,适用于大文件和高吞吐场景;需添加 Maven 依赖、用 WstxInputFactory/WstxOutputFactory 创建读写器,并禁用 DTD 等非必要功能以提升性能与安全。

Woodstox 是 Java 中最成熟、高性能的 StAX(Streaming API for XML)实现之一,比 JDK 自带的 StAX(如 Sun XMLStreamReader)更稳定、功能更全、解析更快,尤其适合处理大 XML 文件或高吞吐场景。
一、添加 Woodstox 依赖
使用 Maven,引入官方维护的最新版(推荐 6.x):
com.fasterxml.woodstox woodstox-core 6.5.1
注意:Woodstox 6+ 要求 Java 8+,且已完全脱离老版本 stax-api,无需额外引入 stax-api 或 stax2-api。
二、创建 Woodstox XMLStreamReader(拉式解析)
核心是用 WstxInputFactory 替代默认的 XMLInputFactory,启用优化特性:
立即学习“Java免费学习笔记(深入)”;
- 禁用 DTD 和外部实体(提升安全与性能)
- 开启命名空间支持(默认已开)
- 设置字符缓冲区大小(可选,对超大文本节点有帮助)
示例代码:
import com.fasterxml.woodstox.stax.WstxInputFactory;
import javax.xml.stream.XMLStreamReader;
import java.io.InputStream;
WstxInputFactory factory = new WstxInputFactory();
factory.configureForXmlCompliance(); // 启用标准兼容模式
factory.setProperty(WstxInputFactory.P_INPUT_PERSISTENT_BUFFER, false);
factory.setProperty(WstxInputFactory.P_ALLOW_DOCTYPE_DECLS, false); // 禁用 DTD
factory.setProperty(WstxInputFactory.P_ALLOW_XML_COMMENTS, false); // 可选:跳过注释加快解析
InputStream is = getClass().getResourceAsStream("/data.xml");
XMLStreamReader reader = factory.createXMLStreamReader(is);
while (reader.hasNext()) {
int event = reader.next();
if (event == XMLStreamReader.START_ELEMENT) {
String localName = reader.getLocalName();
if ("user".equals(localName)) {
String id = reader.getAttributeValue(null, "id");
System.out.println("Found user: " + id);
}
} else if (event == XMLStreamReader.CHARACTERS) {
String text = reader.getText().trim();
if (!text.isEmpty()) {
System.out.println("Text: " + text);
}
}
}
reader.close();
三、用 XMLStreamWriter 写入 XML(同样高性能)
Woodstox 的写入器也比默认实现快,支持自动缩进、CDATA、自定义前缀等:
- 调用
WstxOutputFactory创建XMLStreamWriter - 启用自动换行和缩进(仅用于调试/可读性,生产环境建议关闭)
- 用
writeStartElement()/writeAttribute()/writeCharacters()构建结构
示例:
import com.fasterxml.woodstox.stax.WstxOutputFactory;
import javax.xml.stream.XMLStreamWriter;
import java.io.StringWriter;
WstxOutputFactory factory = new WstxOutputFactory();
factory.setProperty(WstxOutputFactory.P_OUTPUT_INDENTATION, " "); // 可选
StringWriter sw = new StringWriter();
XMLStreamWriter writer = factory.createXMLStreamWriter(sw);
writer.writeStartDocument();
writer.writeStartElement("root");
writer.writeStartElement("item");
writer.writeAttribute("id", "101");
writer.writeCharacters("Hello World");
writer.writeEndElement();
writer.writeEndElement();
writer.writeEndDocument();
writer.close();
System.out.println(sw.toString());
四、关键性能调优技巧
真正发挥 Woodstox 高性能,需注意这些点:
- 复用 InputFactory / OutputFactory 实例:它们是线程安全的,全局单例即可
- 避免频繁调用 getText() 多次:StAX 的 CHARACTERS 事件可能被拆成多个,用 getTextCharacters() + getTextLength() 批量读取更高效
- 关闭不需要的功能:如注释、CDATA、DTD、XML 声明验证等,通过 setProperty 关闭
- 配合 NIO Channel 或 BufferedInputStream 使用:减少 I/O 层瓶颈,特别是读大文件时
基本上就这些。Woodstox 不复杂但容易忽略配置细节,开箱即用已经很快,稍加调优就能在百万级 XML 行解析中保持低延迟和低 GC 开销。











