2012-08-12 75 views
0

我正在實現的一個API處理包含分層結構化數據的InputStreams,即嵌套塊(包括葉塊中的多個圖像)。 (如果您必須知道,我解析的數據是CBEFF。)每個數據塊都以包含有關該塊的一些元數據的標題爲前綴。通過提供InputStream getter來延遲訪問InputStream

1st level 1 header 
    1st level 2 header 
    1st level 2 data block 
    2nd level 2 header 
    2nd level 2 data block 
2nd level 1 header 
    3rd level 2 header 
    3rd level 2 data block 

原始的InputStream是我的API類的構造函數的參數,並沿層次傳遞。 目前我正在將圖像讀入我的API類構造函數中的字節數組中,因此每個構造函數都會在讀取該類負責的完整數據時阻塞,並且稍後客戶端調用該API類的相關getter方法時,它們將獲取從內存中提供的圖像數據。我更願意以某種惰性InputStream的形式向我的API的客戶端提供所包含的圖像,以便圖像字節僅從原始InputStream中讀取,因爲客戶端讀取由吸氣。這使得例如可以進行漸進式渲染,這在原始InputStream較慢時很有用。

有沒有一種優雅的方式來解決這與InputStreams?

+0

錯誤,只是刪除所有的圖像閱讀代碼? – EJP 2012-08-13 01:02:42

+0

@EJP,是的,如果只有一個圖像,並且圖像數據是InputStream中的最後一個元素,它就可以工作。我有多個圖像,圖像_n_ + 1的標題跟在圖像_n_的數據之後。我會澄清這個問題。 – martijno 2012-08-13 07:07:47

回答

1

InputStream不適合隨機存取。因此,在大多數情況下,讀取部分文件並不會起作用,即使您可以使用resetskip的組合在某些輸入流上實現類似效果。但並不是所有的流支持reset,並且跳過字節通常與讀取字節一樣昂貴。

所以我建議你嘗試一些替代方法。您可以將整個流緩衝到某個隨機訪問緩衝區,如臨時文件,這意味着首先從流中讀取所有字節。或者您可以找到一種方法來隨機訪問原始來源。您沒有指定要處理的來源的類型,但例如對於HTTP連接,您可以使用range requestdownload parts。類似的解決方案可能適用於其他來源

不管你如何實現隨機存取(和看到你的評論,你可能會這樣做使用帶有resetskipInputStream),你可以創建自己的類來表示流的一部分。通過繼承FilterInputStream,您可以讓該類本身成爲InputStream的實例。

cLass SubStream extends FilterInputStream { 
    private long offset; 
    public SubStream(long offset, InputStream parent) { 
     super(parent); 
     this.offset = offset; 
    } 
    public SubStream(InputStream parent) { 
     this(0, parent); 
    } 
    @Override public void reset() throws IOException { 
     in.reset(); 
     in.skip(offset); 
    } 
    public SubStream subStream(long offset) { 
     return new FilterInputStream(this.offset + offset, in); 
    } 
    public Object syncObject() { 
     return in; 
    } 
} 

你必須確保使用這些流之一任何操作調用reset第一。如果您需要強制執行正確的流結束處理,則必須覆蓋大多數read實現。如果可能有併發訪問,那麼您將需要同步基礎流上的操作。所以使用這個類的代碼可能看起來像這樣:

 synchronized(part.syncObject()) { 
     part.reset(); 
     return read(part); 
    } 
+0

來源是智能卡讀卡器中的智能卡(所以,連接速度非常慢,我們在這裏只說幾kbps,因此需要支持漸進式渲染)。支持標記和重置,並且跳過很便宜。 – martijno 2012-08-13 10:12:32