8

如前所述当 BinaryReader 或 BinaryWriter 关闭时,其底层 Stream 也将关闭 (aargh)。考虑这种情况:例程R传递了一个 MemoryStream,比如说M;我想写一些东西M,然后将它传递给另一个例程进行更多处理(不一定是写)。为方便起见,我想包装M一个 BinaryWriter 来完成我的写作。写完之后,我完成了 BinaryWriter 但没有完成M.

void R(MemoryStream M)
{
    using (B = new BinaryWriter(M))
    {
        // write some stuff using B
    }

    S(M);  // now pass M to another routine for further processing
}

但是,我不能在不关闭的情况下处理 BinaryStream M

问:有没有办法做到以下任何一项?

  • 从 MemoryStream 中提取底层 byte[],
  • 克隆一个流
  • 关闭后重新打开流
4

7 回答 7

7

您应该更好地使用底层 byte[] 缓冲区

byte[] buffer = ms.GetBuffer();

然后使用 Array.Copy() 方法复制字节数据。你可以自由地用它创建一个新的流。

于 2009-10-27T21:17:59.867 回答
5

您可以使用诸如MiscUtil.IO.NonClosingStreamWrapperin MiscUtil之类的东西,它包装 aStream并简单地忽略Close/Dispose请求。就为了这个目的。

void R(MemoryStream M)
{
    using (B = new BinaryWriter(new NonClosingStreamWrapper(M)))
    {
        // write some stuff using B
    }

    S(M);  // now pass M to another routine for further processing
}    
于 2009-10-27T21:40:56.037 回答
2

你可以:

  • 调用 M.ToArray() 以将流作为字节数组获取。
  • 子类 BinaryWriter 并重写 Dispose 方法以防止关闭子流
于 2009-10-27T21:10:23.330 回答
2

感谢几个建议 ToArray 的人,我得到了正确的答案,即“M.GetBuffer”。ToArray 还不错,但它

  • 复印
  • 只获取缓冲区的一部分

GetBuffer 只是获取对底层 byte[] 的引用,这就是我所追求的。

于 2009-10-27T21:21:09.483 回答
1

只需将其添加到此处,一个非常简单的解决方案就是不要Dispose() 编写器。

void R(MemoryStream M)
{
    B = new BinaryWriter(M);

    // write some stuff using B        
    B.Flush();
    S(M);  // now pass M to another routine for further processing
}

现在您只需要担心将 B 保持在范围内,这将在 R() 期间。

这可能不是这里最好的解决方案,但值得注意的是,Readers 和 Writers 不需要 Disposing 自己。

于 2009-10-27T21:42:52.473 回答
0

一种有点幼稚的方法是使用

byte buf[] = MemoryStream.ToArray();

将流内容复制到字节数组。你可以把它变成一个流

MemoryStream ms = new MemoryStream(buf);
于 2009-10-27T21:10:04.560 回答
0

根据这个M.Clone(); 应该管用。但我可能错了...

于 2009-10-27T21:12:41.323 回答