• BinaryReader和BinaryWriter的leaveOpen参数 z


    在.NET 4.5后,微软为BinaryWriterBinaryReader类型的构造函数中加入了leaveOpen参数,当该参数为true后,BinaryReader或者BinaryWriter关闭后不会关闭其内部的Stream对象。

    但是在.NET 4.5之前,怎样在BinaryWriter或者BinaryReader关闭之后不关闭内部Stream呢?

    有两种方法,第一种,通过ILSpy查看.NET 2.0的BinaryWriter和BinaryReader的Dispose方法,发现它的执行就是调用内部Stream的Close方法。所以方法一就是不调用BinaryWriter或者BinaryReader类型的Dispose方法。注意对于BinaryWriter类型,此时需要调用Flush方法确保所有数据写入到内部Stream中。

    但是第一种方法显然违背了IDisposable对象需在使用后调用Dispose方法的惯例。同时,这是.NET Framework中的内部逻辑,是不可依赖的。

    那么我建议使用第二种方法,创建一个自定义的Stream类型,比如一个关不掉的Stream类型起名叫UnclosableStream。这个Stream类型会包装另一个Stream对象的所有方法执行,除了Dispose方法。同时提供另一个方法叫RealDispose,供用户去真正关闭这个Stream。

    示例代码:

    //在.NET 2.0 - 4.0下使用 UnclosableStream ucStream; MemoryStream ms =newMemoryStream(); using (ucStream =newUnclosableStream(ms)) using (var writer =newBinaryWriter(ucStream)) {     writer.Write(7); Console.WriteLine(BitConverter.ToString(ms.ToArray())); } //此时BinaryWriter会关闭ucStream,但是他不会被关闭。 Console.WriteLine(ms.CanWrite); //这里真正关闭 ucStream.RealClose(); Console.WriteLine(ms.CanWrite);

    输出:

    07-00-00-00 True False

    UnclosableStream类型代码:

    //+ using System.IO; publicclassUnclosableStream : Stream { Stream _stream;
    public UnclosableStream(Stream stream) { if (stream ==null) { thrownewArgumentNullException("stream"); }
    _stream = stream; }
    //真正的Dispose publicvoid RealClose() { _stream.Close(); }
    //空Dispose protectedoverridevoid Dispose(bool disposing) { }
    #region 其他Stream方法保持不变
    publicoverridebool CanRead { get { return _stream.CanRead; } }
    publicoverridebool CanSeek { get { return _stream.CanSeek; } }
    publicoverridebool CanWrite { get { return _stream.CanWrite; } }
    publicoverridevoid Flush() { _stream.Flush(); }
    publicoverridelong Length { get { return _stream.Length; } }
    publicoverridelong Position { get { return _stream.Position; } set { _stream.Position =value; } }
  • 相关阅读:
    第八场 hdu 6136 Death Podracing(dfs+思维)
    第九场 hdu 6162 Ch’s gift(树链剖分+线段树)
    树链剖分 模板
    CodeForces
    第十场 hdu 6172 Array Challenge(矩阵快速幂)
    第十场 hdu 6171 Admiral(双向bfs找交点)
    CodeForces
    第十场 hdu 6178 (bfs)
    第十场 hdu 6180 Schedule (multiset)/(思维)
    第八场 hdu 6143 Killer Names(思维题)
  • 原文地址:https://www.cnblogs.com/zeroone/p/3708100.html
Copyright © 2020-2023  润新知