我有2個BufferedInputStreams,它們都包含一個xml字符串:一個小字符串和一個非常大的字符串。BufferedInputStream標記/重置無效標記
這裏的每個XML字符串的開始看起來像:
<RootElement success="true">
我創建了一個方法:
- 在InputStream的開始
- 讀取設置標記xml的前幾個字節來檢查根元素是否具有特定的屬性。
- 將輸入流重置到標記位置,因此另一種方法可以享受完整的完整流。
我的印象是,緩衝輸入流的緩衝區大小(默認值爲8012bytes)和標記讀取限制的大小實際上很重要,因爲我只是在重置前像前50個字節一樣讀取,而不管我的輸入流有多大。
不幸的是我得到一個「IOException: resseting to invalid mark
」異常。這裏是相關的代碼:
private boolean checkXMLForSuccess(BufferedInputStream responseStream) throws XMLStreamException, FactoryConfigurationError
{
//Normally, this should be set to the amount of bytes that can be read before invalidating.
//the mark. Because we use a default buffer size (1024 or 2048 bytes) that is much greater
//than the amount of bytes we will read here (less than 100 bytes) this is not a concern.
responseStream.mark(100);
XMLStreamReader xmlReader = XMLInputFactory.newInstance().createXMLStreamReader(responseStream);
xmlReader.next(); //Go to the root element
//This is for loop, but the root element can only have 1 attribute.
for (int i=0; i < xmlReader.getAttributeCount(); i++)
{
if(xmlReader.getAttributeLocalName(i).equals(SUCCES_ATTRIBUTE))
{
Boolean isSuccess = Boolean.parseBoolean(xmlReader.getAttributeValue(i));
if (isSuccess)
{
try
{
responseStream.reset();
}
catch (IOException e)
{
//Oh oh... reset mark problem??
}
return true;
}
}
}
return false;
}
現在,我嘗試將標記讀取限制設置爲更高的數字。在它最終奏效之前,我必須將它設置爲10000。我無法想象我的下面的代碼需要讀取10000個字節!還有哪些其他因素可以對此行爲負責?
如果xmlReader.next()讀取的字節數超過100個字節,爲什麼500字節的小XML文件可以工作,但大小爲5000的xml文件不起作用?都具有相同的根元素,並具有相同的屬性,並且都大於100個字節。 – user1884155 2014-09-04 15:46:56
@ user1884155在這一點上,沒有真正查看XMLReader在OpenJDK代碼中做了什麼,這都是猜測。 – Powerlord 2014-09-04 15:56:37
@ user1884155,@ Powerlord - 已更新我的回覆與您的意見 – BatScream 2014-09-04 15:57:35