有什么办法可以在不closuresBaseStream的情况下closuresStreamWriter?
我的根本问题是,当在StreamWriter
上using
调用Dispose
时,它也会处理BaseStream
(与Close
相同的问题)。
我有一个解决方法,但你可以看到,它涉及复制stream。 有没有办法做到这一点,而不复制stream?
这样做的目的是将string(最初从数据库中读取)的内容转换为stream,以便第三方组件可以读取该stream。
注意 :我无法更改第三方组件。
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; }
用作
public void Noddy() { System.IO.Stream myStream = CreateStream("The contents of this string are unimportant"); My3rdPartyComponent.ReadFromStream(myStream); }
理想情况下,我正在寻找一个名为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; }
如果您使用的是.NET Framework 4.5或更高版本,则会出现StreamWriter重载,通过该重载,您可以要求基本stream在closures写入器时保持打开状态 。
在早于4.5版本的早期版本的.NET Framework中, StreamWriter
假定它拥有该stream。 选项:
- 不要丢弃
StreamWriter
; 只是冲洗它。 - 创build一个忽略调用
Close
/Dispose
的stream包装器,但代理其他所有东西。 我有一个MiscUtil的实现,如果你想从那里抓住它。
.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 )
只要不要在StreamWriter
上调用Dispose
。 这个类可以丢弃的原因不是因为它拥有非托pipe资源,而是允许处理本身可能拥有非托pipe资源的stream。 如果底层stream的生命在别处处理,则不需要处置作者。
内存stream具有即使在closuresstream时也可以使用的ToArray属性。 数组写入stream内容到一个字节数组,无论Position属性如何。 您可以根据您写入的stream创build新的stream。
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; }
您需要创buildStreamWriter的后代并覆盖它的dispose方法,通过总是将false传递给disposing参数,它将强制streamwriter不closures,StreamWriter只是在close方法中调用dispose,所以不需要重写它(当然你可以添加所有的构造函数,如果你想,我只有一个):
public class NoCloseStreamWriter : StreamWriter { public NoCloseStreamWriter(Stream stream, Encoding encoding) : base(stream, encoding) { } protected override void Dispose(bool disposing) { base.Dispose(false); } }