通过StreamWriter或文件写入修改数据

本文关键字:修改 数据 文件 StreamWriter 通过 | 更新日期: 2023-09-27 18:07:12

我需要创建二进制数据文件。它不能在一次传递中创建,我需要序列化一些数据,然后返回并在标题中写入偏移量。文件将舒适地适合内存(几兆字节)。我可以用BinaryWriter然后用writer.Seek(x, SeekOrigin.Begin)写偏移量吗?或者写文件(然后修改它)有什么好处?或者也许没有真正的区别?

通过StreamWriter或文件写入修改数据

您应该创建一个封装结构来表示标题,而不是在文件中偏移。填充结构并将其写入文件的开头。它也将更容易阅读结构一次。

我想我明白你的问题了。您正在序列化来自程序其他部分的对象,并且您不知道每个块有多大,直到您要求序列化它。你不希望一次序列化所有的,因为那可能会占用很多内存。

所以你想在你的文件前面留一些空间,写二进制数据块,同时记录每个块的大小,然后返回并写header来指示每个块的开始和结束位置。

你问的解决方案似乎是合理的,但我相信BinaryWriter会覆盖,如果你寻求回你的头的位置,所以你需要写一个空字节垫在前面给自己留出空间来写头-http://msdn.microsoft.com/en-us/library/system.io.binarywriter.seek.aspx Y640

现在的问题是,你的标题有多大?你写了多少个空字节?可能取决于你要序列化的对象的数量。听起来你现在遇到的问题和以前一样。

相反,我会按顺序打包您的数据,例如:

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

length参数对该块的总长度进行编码,然后是每个块的任何属性,然后是被序列化的实际对象的原始字节。