2014-03-26 26 views
0

我有一個事件在我接收數據時被觸發。收到的數據是大型壓縮流的一部分。如何使用DeflateStream解壓直播數據?

目前,我維護一個MemoryStream,並且每當我收到數據時我都會打電話給Write。但是,爲了解壓縮這些數據,我需要在它周圍包裝一個DeflateStream。問題是,當您在DeflateStream上撥打Read時,它會讀取零字節!

這是因爲DeflateStream.BaseStreamMemoryStream我剛寫來的,所以MemoryStream.Position已經更新,對於閱讀寫作。

是否有替代品在每個MemoryStream.Write之後致電MemoryStream.Seek(-bytesJustWritten, SeekOrigin.Current)

我需要能夠實時讀取解壓縮的字節,而無需等待流的關閉。

我以爲我可以使用兩個MemoryStream對象,一個用於緩衝我的輸入,然後一個用於複製然後讀取,但我很快意識到它會出現相同的問題;您無法寫入流,然後在沒有首先查找的情況下從中讀取數據。

+1

我通過創建所謂的'ProducerConsumerStream'解決了這個問題。這是一個自定義對象,具有實現「Stream」接口的固定大小的循環緩衝區。你寫信給一方,從另一方讀。見[建立一個新類型的流](http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=852) –

+0

@JimMischel你應該已經添加了這個答案:) –

+0

如果我' d有東西要添加到文章中,我會讓它成爲答案。但不鼓勵鏈接的答案。 –

回答

0

我通過使用一個MemoryStream解決了這個問題,並在每次調用MemoryStream.Write之後調用MemoryStream.Seek(-bytesJustWritten, SeekOrigin.Current)

這會重置流的位置,以允許剛剛解壓縮的數據被讀取並稍後覆蓋,同時保留DeflateStream的狀態。

相關問題