首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MemoryStream故障

MemoryStream故障
EN

Stack Overflow用户
提问于 2012-07-21 04:47:10
回答 2查看 4.8K关注 0票数 5

我在使用MemoryStream时遇到了一些问题

我们使用的是第三方电子表格组件(类似于excel),我尝试将数据保存为html格式,他们通过下面的SaveHtml方法支持这种格式。基于他们的文档看起来非常简单。下面是我的代码:

代码语言:javascript
复制
using (var memoryStream = new MemoryStream())
{
   this.ActiveSheet.SaveHtml(memoryStream);

   memoryStream.Position = 0;

   using (var streamReader = new StreamReader(memoryStream))
   {
       var htmlData = streamReader.ReadToEnd();
   }
}

设置memoryStream.Position = 0时出现异常

System.ObjectDisposedException: Cannot access a closed Stream.

快速查看他们在Reflector中的SaveHtml方法会显示以下相关行:

代码语言:javascript
复制
public void SaveHtml(Stream stream)
{
    StreamWriter writer = null;

    try
    {
        writer = new StreamWriter(stream) { AutoFlush = true };

        writer.Write(str);
    }   
    finally
    {
        if (writer != null)
        {
            writer.Close();
        }
    }
}

我猜是因为streamWriter被他们的代码关闭了,所以我们不走运。关闭streamWriter,关闭底层流,对吧?

有什么办法解决这个问题吗?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-21 05:00:33

它似乎起作用了,所以你可以创建另一个内存流。提取缓冲区时不复制任何字节。

代码语言:javascript
复制
using (var memoryStream = new MemoryStream()) {
    this.ActiveSheet.SaveHtml(memoryStream);
    var buffer = memoryStream.GetBuffer();
    using (var memoryStream2 = new MemoryStream(buffer))
    using (var streamReader = new StreamReader(memoryStream2)) {
        var htmlData = streamReader.ReadToEnd();
    }
}

或者,您可以推出自己无法关闭的MemoryStream并将其提供给SaveHtml。这也会阻止对它的处理,因为Dispose只是调用Close。再说一次,imho:

代码语言:javascript
复制
class MemoryStream2 : MemoryStream {
    public override void Close() { }
}
票数 6
EN

Stack Overflow用户

发布于 2017-07-30 20:31:30

可以在这样的上下文中使用替代的memory stream实现:

代码语言:javascript
复制
var stream = new ChunkedStream(pool, asOutputStreamOnDispose: true);

using (var writer = new StreamWriter(stream))
{
    writer.Write("hello world");
}

Assert.AreEqual(0, stream.Position);
Assert.AreEqual(ChunkedStreamState.ReadForward, stream.State);
Assert.AreEqual(3, pool.TotalAllocated);

using (var reader = new StreamReader(stream))
{
    Assert.AreEqual("hello world", reader.ReadToEnd());
    Assert.AreEqual(0, pool.TotalAllocated);
}

Assert.AreEqual(ChunkedStreamState.Closed, stream.State);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11586733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档