代码之家  ›  专栏  ›  技术社区  ›  Binary Worrier

有没有办法关闭StreamWriter而不关闭其基流?

  •  100
  • Binary Worrier  · 技术社区  · 16 年前

    我的根本问题是 using 电话 Dispose 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;
    }
    

    用作

    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;
    }
    
    5 回复  |  直到 10 年前
        1
  •  127
  •   Peter Duniho    5 年前

    如果您使用的是.NET Framework 4.5或更高版本,则 StreamWriter overload using which you can ask the base stream to be left open when the writer is closed .

    在.NET Framework 4.5之前的早期版本中, StreamWriter 假设

    • 不要处理垃圾 ; 把它冲洗一下。
    • 创建忽略调用的流包装器 Close / Dispose 但同时代理其他一切。我有一个在中国的实现 MiscUtil ,如果你想从那里抓住它。
        2
  •  45
  •   Peter Duniho    5 年前

    StreamWriter(Stream, Encoding, Int32, Boolean)

    public StreamWriter(
        Stream stream,
        Encoding encoding,
        int bufferSize,
        bool leaveOpen
    )
    
        3
  •  37
  •   Darin Dimitrov    16 年前

    Dispose StreamWriter

        4
  •  7
  •   Tudor    14 年前

    内存流具有ToArray属性,即使在流关闭时也可以使用该属性。 toarray将流内容写入字节数组,而不考虑Position属性。

    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;
    }
    
        5
  •  2
  •   Aaron Murgatroyd    14 年前

    您需要创建StreamWriter的子代并重写其dispose方法,通过始终将false传递给disposing参数,它将强制流编写器不关闭,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);
        }
    }