下面是關於如何從一個元素流在解析 使用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