我需要創建二進制數據文件。它不能一次創建,我需要序列化一些數據,然後返回並在標題中寫入偏移量。文件將舒適地放入內存(幾兆字節)。我可以使用BinaryWriter
並返回使用writer.Seek(x, SeekOrigin.Begin)
寫補償嗎?或者也許寫文件(然後控制它)有什麼優勢?或者,也許沒有真正的區別?通過StreamWriter或文件寫入修改數據?
回答
而不是偏移到文件中,您應該創建一個打包結構來表示標題。填寫結構並在文件的開頭寫入。一次閱讀結構也更容易。
在數據的其餘部分被序列化(寫入文件/流寫入器)之前,我不知道在頭中寫入的值。如果我們將「寫入偏移」改爲「寫入填充頭結構」,問題仍然存在。 – tomash
將空結構寫入文件。然後將所有記錄偏移的'東西'寫入結構中。然後重寫結構...(當然在零點偏移處)。 –
我想我理解你的問題。你正在序列化來自程序其他部分的對象,並且你不知道每個塊有多大,除非你要求序列化它,而且你不想一次全部序列化它們,因爲這可能是一個大量的記憶。
因此,您希望在文件的前面留出一些空間,同時將大量二進制數據寫入塊中,同時記錄每個塊的大小,然後返回並寫入頁眉以指示每個塊在哪裏啓動和停止。
你問的解決方案似乎是合理的,但我相信BinaryWriter會覆蓋,如果你尋求回到你的標題位置,所以你需要先寫一個空字節墊留下自己的空間來寫頭 - http://msdn.microsoft.com/en-us/library/system.io.binarywriter.seek.aspx#Y640
現在的問題是,您的標題將會有多大?你寫了多少個空字節?可能要取決於你必須序列化的對象數量。聽起來像現在你有和以前一樣的問題。
相反,我會收拾你的數據順序,作爲一個例子:
| --------- Chunk 1 ----------|--------- Chunk 2 -----------|
| length | name | ... | bytes | length | name | ... | bytes |
長度參數編碼塊的總長度,然後你有你每塊有什麼特性,那麼無論原始字節是爲了序列化的實際對象。
- 1. C#StreamWriter未寫入文件
- 2. 寫入修改文件
- 3. 使用StreamReader和StreamWriter來修改文件
- 4. 通過AJAX或PHP將JavaScript數據寫入JSON文件
- 5. StreamWriter不寫數據
- 6. asp.net窗體輸出:streamwriter寫入文件與數據庫連接
- 7. StreamWriter爲什麼改變它寫入文件的文本?
- 8. 如何使用StreamWriter寫入文件?
- 9. 使用StreamWriter和FileStream寫入txt文件
- 10. 如何使用StreamWriter寫入csv文件?
- 11. 的StreamWriter寫入現有文件
- 12. VB - 使用StreamWriter寫入文件
- 13. C#類庫:StreamWriter寫入system32文件夾
- 14. C#StreamWriter,寫入不同類的文件?
- 15. 將文件流寫入StreamWriter中c#
- 16. 使用Streamwriter寫入現有文件
- 17. 如何通過StreamWriter更改文件中的某些文本
- 18. 修改由Ext4文件系統寫入磁盤的數據
- 19. IPC通過寫入文件?
- 20. 通過PHP寫入文件
- 21. 通過使用C#修改某些字符來寫入文本文件?
- 22. 寫入文本文件或通過鍵/值數據庫的速度
- 23. Hadoop:寫入後修改輸出文件
- 24. 寫入文件通過更改文件到RTF - awk的
- 25. 修改數據庫文件
- 26. 的StreamWriter重寫文件或追加到該文件
- 27. 合併多個文本文件 - StreamWriter不寫入一個文件?
- 28. 通過圖表操作修改數據
- 29. 通過AJAX修改數據庫值
- 30. 通過Rails將數據從SQL文件或Excel文件導入數據庫
你需要做多少工作?如果您用於寫入程序的基礎流是MemoryStream而不是FileStream,那麼我認爲它會更快。這樣可以減少磁盤訪問,並且可以一次性將完成的流寫入磁盤。 – havardhu