2011-04-19 15 views
2

我有一個字節流進入我的應用程序(它實際上是從文件讀取,但是這可能會改變)。在java中的字節流上創建滾動窗口

數據的格式爲<tag><value>。我正在尋找一個特定的標籤,並希望放棄所有其他人。

我的想法是有一個長度(標籤長度+值長度)的「窗口」,並將數據推入其中,並將舊數據放下。然後只要第一個(標籤長度)字節匹配標籤即時消息感興趣,我可以得到整個窗口並處理它。

我不認爲在SDK中有什麼符合我的需求,但很樂意被證明是錯誤的。有任何想法嗎?

編輯:澄清,數據不是xml - ive只是使用斜角括號來顯示劃界。數據實際上是一個二進制流。

回答

0

使用字節流來解析XML文件正在招致麻煩。

我強烈建議使用不緩衝內存中整個文檔(或創建完整的DOM表示)的流式XML解析器(例如SAXParser)。內置於JDK中的SAX解析器在內存使用方面非常高效。

+0

它不是XML - 我已經澄清了我的問題。 – PaulJWilliams 2011-04-19 16:23:08

0

JDK中最接近的事情是使用ByteBuffer.compact(),它允許您沿緩衝區中的數據進行隨機播放。避免過多調用緊湊的一種方法是使緩衝區相當大,並且只在空間不足時調用緩衝區。

如果您的數據格式很簡單,即不是完整的XML標準,那麼我只會使用一個ByteBuffer。

+0

它不是xml-iive澄清了我的問題 – PaulJWilliams 2011-04-19 16:23:48

0

使用環形緩衝器,即圓形固定長度緩衝器(陣列)。您保留兩個指針,一個指向數據的開始(即環中最舊的字節),另一個指向數據的結尾(指向最新的字節)。

您掃描從開始指針到結束指針的響鈴。在某些時候,比如當你用完戒指的內容時,你會將新數據讀入戒指,覆蓋舊數據,然後適當調整指針。由於它是一個環,因此當您將指針遞增到數組的末尾時,您將環繞回到數組的開頭。

UPDATE

在Java中使用的環形緩衝區的一個例子是:
http://david.tribble.com/src/java/tribble/util/FifoQueue.java