我在使用MemoryStream时遇到了一些问题
我们使用的是第三方电子表格组件(类似于excel),我尝试将数据保存为html格式,他们通过下面的SaveHtml方法支持这种格式。基于他们的文档看起来非常简单。下面是我的代码:
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方法会显示以下相关行:
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,关闭底层流,对吧?
有什么办法解决这个问题吗?
谢谢。
发布于 2012-07-21 05:00:33
它似乎起作用了,所以你可以创建另一个内存流。提取缓冲区时不复制任何字节。
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:
class MemoryStream2 : MemoryStream {
public override void Close() { }
}发布于 2017-07-30 20:31:30
可以在这样的上下文中使用替代的memory stream实现:
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);https://stackoverflow.com/questions/11586733
复制相似问题