MemoryStream读/写和数据长度



我有一个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个问题是:

  1. 在我阅读后,位置移动到currentPosition+readed,是否memStram。长度会改变吗
  2. 我想初始化流(就像我刚刚创建它一样),我可以使用Dispose和new再次执行以下操作吗;新增:
memStram.Position = 0;
memStram.SetLength(0);

谢谢。Joseph

  1. 否;为什么长度(即数据大小)应该在读取时更改
  2. 是;SetLength(0)更快:在这种情况下,内存分配和重新分配没有开销

1:我阅读后,位置移动到currentPosition+readed,memStram.Length会改变吗?

阅读通常不会改变.Length,只会改变.Position;但严格来说,即使在读取(通常:写入)时查看.Length.Position也是一个坏主意,因为并非所有流都支持这一点。通常,你会一直读到(其中一个,取决于场景):

  • 直到您读取了预期的字节数,例如通过某个长度的标头告诉您需要多少字节
  • 直到您看到sentinel值(在文本协议中很常见;在二进制协议中不那么常见)
  • 直到流结束(其中Read返回非正值)

我可能还会说:不要使用BinaryWriter。除了使用Stream之外,它似乎没有添加任何有用的内容。

2:我想初始化流(就像我刚刚创建它一样),我可以再次使用Dispose和new来执行以下操作吗;新增:

是的,SetLength(0)MemoryStream来说很好。它不一定在所有情况下都是好的(例如,它在NetworkStream上没有多大意义)。

不,长度不应该改变,您可以使用手表变量轻松检查

我会使用using语句,这样语法会更优雅、更清晰,而且以后您不会忘记处理它。。。

相关内容

  • 没有找到相关文章