为什么using (var sw = new StreamWriter(ms))
返回Cannot access a closed Stream
exception
,而MemoryStream
位于此代码的顶部?
using (var ms = new MemoryStream())
{
using (var sw = new StreamWriter(ms))
{
sw.WriteLine("data");
sw.WriteLine("data 2");
ms.Position = 0;
using (var sr = new StreamReader(ms))
{
Console.WriteLine(sr.ReadToEnd());
}
} //error here
}
字符串
7条答案
按热度按时间5uzkadbs1#
这是因为
StreamReader
在被释放时会自动关闭底层流。using
语句会自动执行此操作。但是,您正在使用的
StreamWriter
仍在尝试处理流(此外,writer的using
语句现在正在尝试释放StreamWriter
,然后StreamWriter
将尝试关闭流)。解决这个问题的最好方法是:不要使用
using
,也不要丢弃StreamReader
和StreamWriter
。参见this question。字符串
如果你对
sw
和sr
被垃圾收集而没有在代码中处理感到不好(推荐),你可以这样做:型
tktrz96b2#
自.net45起,您可以使用
StreamWriter
的LeaveOpen
构造函数参数,并且仍然使用using
语句。示例:字符串
oaxa6hgo3#
当
StreamReader
的using()
结束时,它会释放对象并关闭流,而StreamWriter
仍在尝试使用该流。wgxvkvu94#
当它从using语句中出来时,
Dispose
方法将被调用,自动关闭流试试下面的:
字符串
ru9i0ody5#
问题就出在这个区块:
字符串
当
StreamReader
关闭时(在离开using之后),它也关闭了它的底层流,所以现在MemoryStream
关闭了。当StreamWriter
关闭时,它试图将所有内容刷新到MemoryStream
,但它关闭了。您应该考虑不要将
StreamReader
放在using块中。i34xakig6#
你必须让流打开才能读取它。“StreamWriter”在完成写入后关闭它
字符串
iih3973s7#
在我的例子中(诚然非常《双城之战》,不太可能经常被复制),这是导致问题的原因(这段代码与使用iTextSharp生成PDF有关):
字符串
声明一个3-cell/columned表,然后只设置两个值的宽度是导致问题的原因。一旦我将“PdfPTable(3)”改为“PdfPTable(2)”,问题就像对流烤箱一样。