无法访问memoryStream的封闭Stream,如何重新打开?

时间:2012-03-01 00:21:11

标签: c#

我有一个memoryStream实例,它已关闭。

我已经尝试过了:

memoryStream.Flush();
memoryStream.Position=0;

重新打开内存流但不起作用。如何重新打开已关闭的内存流?

4 个答案:

答案 0 :(得分:35)

您可以克隆原始克隆,然后使用克隆,即使原件已关闭也是如此。即使原始的创建容量为1000,ToArray()也会返回一个2元素数组。另一方面,ToBuffer()可以获得整个缓冲区,这是您不想要的。

MemoryStream original = new MemoryStream(1000);
original.WriteByte(4);
original.WriteByte(5);

MemoryStream dolly = new MemoryStream(original.ToArray());
dolly.Seek(0, SeekOrigin.Begin);

答案 1 :(得分:14)

试试这个:

memoryStream = new MemoryStream(memoryStream.ToArray());

答案 2 :(得分:12)

  

如何重新打开已关闭的内存流?

您无法重新打开该流。如果您需要“重置”流,只需为其分配一个新实例:

memoryStream = new MemoryStream();

答案 3 :(得分:1)

这是一个古老而古老的问题,但我对这一事实作出反应,即接受的答案并不真正有用,而得票最高的答案则表示使用.ToArray()优于.GetBuffer()。我认为在许多情况下,也许是大多数使用.GetBuffer()的情况明显好于使用.ToArray()。

这是一个内存流关闭的问题示例,尽管您希望继续使用它:

ResourceWriter

ResourceWriter类需要一个支持流,所以我给它一个新创建的内存流。但是当不再需要MemoryStream时,它会关闭后备流。然后我基于后备流的缓冲区创建一个新的MemoryStream,它工作正常,即使它已关闭。

在这种情况下,我碰巧知道调用程序将使用提供的内存流将数据复制到另一个缓冲区,然后立即关闭内存流。因此不需要创建新的字节数组,并且创建新的字节数组有一个性能优势。

感谢@JoshVarty展示了如何避免{{1}}在此处关闭的问题:https://github.com/dotnet/roslyn/issues/7791