我如何在.NET中"分叉"一个流?

I. *_*edy 8 c# clone memorystream stream

正如前面所讨论的,当一个BinaryReader在或的BinaryWriter被关闭,它的底层流中获取关闭以及(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
}
Run Code Online (Sandbox Code Playgroud)

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

问:有没有办法做以下任何一种情况?

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

Ric*_*res 7

你最好使用底层的byte []缓冲区

byte[] buffer = ms.GetBuffer();
Run Code Online (Sandbox Code Playgroud)

然后使用Array.Copy()方法复制字节数据.您可以随意创建新流.


Mar*_*ell 5

您可以使用的东西,如MiscUtil.IO.NonClosingStreamWrapperMiscUtil,其中封装了Stream和简单地忽略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
}    
Run Code Online (Sandbox Code Playgroud)


I. *_*edy 2

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

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

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