我想分割一個字節流成大小不斷增加的塊。如何實現一個懶惰的流塊枚舉器?
源流包含未知數量的字節,且讀取起來非常昂貴。枚舉器的輸出應該是大小遞增的字節數組,從8KB開始到1MB。
這很簡單,只需讀取整個流,將其存儲在一個數組中,然後取出相關的部分。然而,由於流可能非常大,因此立即閱讀是不可行的。此外,儘管性能不是主要關注的問題,但保持系統負載非常低很重要。
在實現這個過程中,我注意到保持代碼的簡潔性和維護性相對困難。有幾個流相關的問題也要記住(例如,Stream.Read可能不會填充緩衝區,即使它成功了)。
我沒有找到任何有助於我的案例的現有類,也不能在網上找到關閉的東西。你將如何實施這樣的課程?
你會遍歷它不止一次?迭代器能夠返回流還是需要返回byte []?如果它是流,它會在你繼續前完全閱讀嗎?如果是這樣的話,編寫一個迭代器很容易,只需使用一個小緩衝區就可以將源碼流拆分爲更小的碼流。或者,你是否知道一開始塊的大小,即是否可以分配一個緩衝區並一次讀取整個塊,或者你是否需要通過它來翻頁找到結束標記? – Rup 2012-02-06 15:50:42
@Rup:只迭代一次。必須是字節[]。整個源碼流太大,無法完全讀取,但各個塊將適合內存。所有塊的大小和位置是已知的,但源流的實際長度是未知的(最終塊可能小於其假定的大小)。 – mafu 2012-02-06 16:02:04