下面是关于如何从一个元素流在解析 使用StAX是可能的,使用Woodstox框架的一些细节。
在this article有一个很好的概述。
从XMLInputFactory我们可以使用ServletInputStream调用createXMLStreamReader(java.io.InputStream stream)。这将返回一个XMLStreamReader2,其中 有一个getText(Writer w,boolean preserveContents)方法,该方法返回int的 写入的字节数。该方法必须执行。在 实施Stax2ReaderImpl有此实现
// // // StAX2, Pass-through text accessors
public int getText(Writer w, boolean preserveContents)
throws IOException, XMLStreamException
{
char[] cbuf = getTextCharacters();
int start = getTextStart();
int len = getTextLength();
if (len > 0) {
w.write(cbuf, start, len);
}
return len;
}
在这段代码中,我们需要改变getTextCharacters()方法,使其 从InputStream读取。在Woodstox测试中TestGetSegmentedText testSegmentedGetCharacters()方法我们看到一个sr.getTextCharacters(offset,buf, start,len)方法的使用。实际上,多参数XMLStreamReader.getTextCharacters()的javadoc显示了以下实现。
int length = 1024;
char[] myBuffer = new char[ length ];
for (int sourceStart = 0 ; ; sourceStart += length) {
int nCopied = stream.getTextCharacters(sourceStart, myBuffer, 0, length);
if (nCopied < length) {
break;
}
}
不清楚你想完成什么。如果您正确使用Streams,则不应将数据同时保存在内存中。另一方面,我认为你的情况并不重要,因为浏览器/客户端可能会在POST中将整个数据提交给你的servlet,然后你才有机会处理它,所以它应该不会有太大影响,因为整个数据将会已经在你身边的记忆中。 – maximdim 2012-02-22 17:54:25
@maximdim问题是关于正确使用流。使用两倍的内存在这种情况下有所不同。 – Glenn 2012-02-22 19:41:58