Bin*_*ier 107 c# dispose stream
我的根本问题是,当using
调用Dispose
a时StreamWriter
,它也会处理BaseStream
(同样的问题Close
).
我有一个解决方法,但正如你所看到的,它涉及复制流.有没有办法这样做而不复制流?
这样做的目的是将字符串(最初从数据库中读取)的内容获取到流中,因此可以由第三方组件读取该流.
注意:我无法更改第三方组件.
public System.IO.Stream CreateStream(string value)
{
var baseStream = new System.IO.MemoryStream();
var baseCopy = new System.IO.MemoryStream();
using (var writer = new System.IO.StreamWriter(baseStream, System.Text.Encoding.UTF8))
{
writer.Write(value);
writer.Flush();
baseStream.WriteTo(baseCopy);
}
baseCopy.Seek(0, System.IO.SeekOrigin.Begin);
return baseCopy;
}
Run Code Online (Sandbox Code Playgroud)
用作
public void Noddy()
{
System.IO.Stream myStream = CreateStream("The contents of this string are unimportant");
My3rdPartyComponent.ReadFromStream(myStream);
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我正在寻找一个名为的假想方法BreakAssociationWithBaseStream
,例如
public System.IO.Stream CreateStream_Alternate(string value)
{
var baseStream = new System.IO.MemoryStream();
using (var writer = new System.IO.StreamWriter(baseStream, System.Text.Encoding.UTF8))
{
writer.Write(value);
writer.Flush();
writer.BreakAssociationWithBaseStream();
}
return baseStream;
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 108
如果您使用的是.NET Framework 4.5或更高版本,则会有一个StreamWriter重载,使用该重载可以在编写器关闭时让基本流保持打开状态.
在4.5之前的早期版本的.NET Framework中,StreamWriter
假定它拥有流.选项:
StreamWriter
; 只是冲洗它.Close
/的调用,Dispose
但代理其他所有内容.我在MiscUtil中有一个实现,如果你想从那里抓取它.mal*_*ger 41
.NET 4.5获得了新的方法!
http://msdn.microsoft.com/EN-US/library/gg712853(v=VS.110,d=hv.2).aspx
public StreamWriter(
Stream stream,
Encoding encoding,
int bufferSize,
bool leaveOpen
)
Run Code Online (Sandbox Code Playgroud)
Dar*_*rov 32
根本就不要打电话Dispose
了StreamWriter
.这个类是一次性的原因不是因为它拥有非托管资源,而是允许处理本身可能拥有非托管资源的流.如果底层流的生命在其他地方处理,则无需处理编写器.
小智 5
内存流具有ToArray属性,即使在关闭流时也可以使用该属性.无论Position属性如何,To Array都将流内容写入字节数组.您可以根据您编写的流创建新流.
public System.IO.Stream CreateStream(string value)
{
var baseStream = new System.IO.MemoryStream();
var baseCopy = new System.IO.MemoryStream();
using (var writer = new System.IO.StreamWriter(baseStream, System.Text.Encoding.UTF8))
{
writer.Write(value);
writer.Flush();
baseStream.WriteTo(baseCopy);
}
var returnStream = new System.IO.MemoryStream( baseCopy.ToArray());
return returnStream;
}
Run Code Online (Sandbox Code Playgroud)