我有一个MemoryStream/BinaryWriter,我使用它如下:
memStram = new MemoryStream();
memStramWriter = new BinaryWriter(memStram);
memStramWriter(byteArrayData);
现在阅读我做如下:
byte[] data = new byte[this.BulkSize];
int readed = this.memStram.Read(data, 0, Math.Min(this.BulkSize,(int)memStram.Length));
我的2个问题是:
- 在我阅读后,位置移动到currentPosition+readed,是否memStram。长度会改变吗
- 我想初始化流(就像我刚刚创建它一样),我可以使用Dispose和new再次执行以下操作吗;新增:
memStram.Position = 0; memStram.SetLength(0);
谢谢。Joseph
- 否;为什么长度(即数据大小)应该在读取时更改
- 是;SetLength(0)更快:在这种情况下,内存分配和重新分配没有开销
1:我阅读后,位置移动到currentPosition+readed,memStram.Length会改变吗?
阅读通常不会改变.Length
,只会改变.Position
;但严格来说,即使在读取(通常:写入)时查看.Length
和.Position
也是一个坏主意,因为并非所有流都支持这一点。通常,你会一直读到(其中一个,取决于场景):
- 直到您读取了预期的字节数,例如通过某个长度的标头告诉您需要多少字节
- 直到您看到sentinel值(在文本协议中很常见;在二进制协议中不那么常见)
- 直到流结束(其中
Read
返回非正值)
我可能还会说:不要使用BinaryWriter
。除了使用Stream
之外,它似乎没有添加任何有用的内容。
2:我想初始化流(就像我刚刚创建它一样),我可以再次使用Dispose和new来执行以下操作吗;新增:
是的,SetLength(0)
对MemoryStream
来说很好。它不一定在所有情况下都是好的(例如,它在NetworkStream
上没有多大意义)。
不,长度不应该改变,您可以使用手表变量轻松检查
我会使用using
语句,这样语法会更优雅、更清晰,而且以后您不会忘记处理它。。。