2011-08-29 27 views
2

我需要創建二進制數據文件。它不能一次創建,我需要序列化一些數據,然後返回並在標題中寫入偏移量。文件將舒適地放入內存(幾兆字節)。我可以使用BinaryWriter並返回使用writer.Seek(x, SeekOrigin.Begin)寫補償嗎?或者也許寫文件(然後控制它)有什麼優勢?或者,也許沒有真正的區別?通過StreamWriter或文件寫入修改數據?

+2

你需要做多少工作?如果您用於寫入程序的基礎流是MemoryStream而不是FileStream,那麼我認爲它會更快。這樣可以減少磁盤訪問,並且可以一次性將完成的流寫入磁盤。 – havardhu

回答

1

而不是偏移到文件中,您應該創建一個打包結構來表示標題。填寫結構並在文件的開頭寫入。一次閱讀結構也更容易。

+0

在數據的其餘部分被序列化(寫入文件/流寫入器)之前,我不知道在頭中寫入的值。如果我們將「寫入偏移」改爲「寫入填充頭結構」,問題仍然存在。 – tomash

+0

將空結構寫入文件。然後將所有記錄偏移的'東西'寫入結構中。然後重寫結構...(當然在零點偏移處)。 –

0

我想我理解你的問題。你正在序列化來自程序其他部分的對象,並且你不知道每個塊有多大,除非你要求序列化它,而且你不想一次全部序列化它們,因爲這可能是一個大量的記憶。

因此,您希望在文件的前面留出一些空間,同時將大量二進制數據寫入塊中,同時記錄每個塊的大小,然後返回並寫入頁眉以指示每個塊在哪裏啓動和停止。

你問的解決方案似乎是合理的,但我相信BinaryWriter會覆蓋,如果你尋求回到你的標題位置,所以你需要先寫一個空字節墊留下自己的空間來寫頭 - http://msdn.microsoft.com/en-us/library/system.io.binarywriter.seek.aspx#Y640

現在的問題是,您的標題將會有多大?你寫了多少個空字節?可能要取決於你必須序列化的對象數量。聽起來像現在你有和以前一樣的問題。

相反,我會收拾你的數據順序,作爲一個例子:

| --------- Chunk 1 ----------|--------- Chunk 2 -----------| 
| length | name | ... | bytes | length | name | ... | bytes | 

長度參數編碼塊的總長度,然後你有你每塊有什麼特性,那麼無論原始字節是爲了序列化的實際對象。