MemoryStream读/写和数据长度

时间:2013-08-07 08:15:07

标签: c# .net stream memorystream binarywriter

我有一个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.Length会改变吗?
  2. 我想初始化流(就像我刚刚创建的那样),我可以使用Dispose再次使用新的,如果没有,那么有更快的方式比使用dispose& new:;
  3. memStram.Position = 0;
    memStram.SetLength(0);
    

    感谢。 约瑟夫

3 个答案:

答案 0 :(得分:3)

  1. 否;为什么长度(即数据大小)会在读取上发生变化?
  2. 是; SetLength(0)更快:在这种情况下,内存分配和重新分配的没有开销

答案 1 :(得分:2)

  

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

阅读通常不会更改.Length - 仅.Position;但严格来说,在阅读时(通常:写作时),.Length.Position 是一个坏主意,因为所有流都不支持。通常,你读到(其中一个,取决于场景):

  • 直到您已经读取了预期的字节数,例如通过一些长度标题告诉您预期会有多少
  • 直到你看到一个标记值(在文本协议中很常见;在二进制协议中不常见)
  • 直到流的末尾(其中Read返回非正值)

我也可能会说:不要使用BinaryWriter。仅仅使用Stream添加它似乎没什么用处。

  

2:我想初始化流(就像我刚刚创建的那样),我可以使用Dispose再次使用新的,如果没有,那么有更快的方式比使用dispose& new:

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

答案 2 :(得分:2)

不会改变长度,您可以使用监视变量轻松检查

我会使用using语句,因此语法会更加优雅和清晰,您不会忘记以后再处理它......