【问题标题】:MemoryStream read/write and data lengthMemoryStream 读/写和数据长度
【发布时间】:2013-08-07 08:15:07
【问题描述】:

我有一个 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));

我的第二个问题是:

  1. 读取后,位置移动到 currentPosition+readed ,是否 memSram.Length 会改变吗?
  2. 我想初始化流(就像我刚刚创建它一样),我是否可以再次使用 Dispose 和 new 执行以下操作,如果没有,是否有比 dispose&new 更快的方法:;
memStram.Position = 0;
memStram.SetLength(0);

谢谢。 约瑟夫

【问题讨论】:

  • memStramWriter(byteArrayData); 是什么意思?因为那不会编译...
  • 所以...你的意思是memStramWriter.Write(byteArrayData) 吗?如果是这样,为什么不只是memStram.Write(byteArrayData, 0, byteArrayData.Length)

标签: c# .net stream memorystream binarywriter


【解决方案1】:
  1. 不;为什么读取时长度(即数据大小)要改变?
  2. 是的; SetLength(0) 更快:在这种情况下,内存分配和重新分配没有开销

【讨论】:

    【解决方案2】:

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

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

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

    我也可能会说:不要使用BinaryWriter。仅使用Stream 添加似乎没有任何有用的东西。

    2:我想初始化流(就像我刚刚创建它一样),我是否可以再次使用 Dispose 和 new 执行以下操作,如果没有,是否有比 dispose&new 更快的方法:

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

    【讨论】:

      【解决方案3】:

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

      我会使用using 语句,这样语法会更优雅和清晰,你以后不会忘记处理它...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-20
        • 2014-04-20
        • 1970-01-01
        • 2012-08-02
        • 2013-11-03
        • 2021-06-15
        相关资源
        最近更新 更多