在.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(); 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; } }

BinaryReader和BinaryWriter的leaveOpen参数 z的更多相关文章

  1. .net 流(Stream) - StreamWriter和StreamReader、BinaryReader和BinaryWriter

    转自:http://www.oseye.net/user/kevin/blog/86 一.StreamWriter和StreamReader 从上一篇博文可知文件流.内存流和网络流操作的都是字节,每次 ...

  2. C#中流的读写器BinaryReader、BinaryWriter,StreamReader、StreamWriter详解【转】

    https://blog.csdn.net/ymnl_gsh/article/details/80723050 C#的FileStream类提供了最原始的字节级上的文件读写功能,但我们习惯于对字符串操 ...

  3. BinaryReader 和BinaryWriter 读写类对象

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  4. task可声明参数 z

    直接这样写 var task1 = Task.Factory.StartNew(() => DoSomeWork(message1, message2)); 如果是winform,你在另外一个线 ...

  5. BinaryWriter和BinaryReader用法

      C#的FileStream类提供了最原始的字节级上的文件读写功能,但我们习惯于对字符串操作,于是StreamWriter和 StreamReader类增强了FileStream,它让我们在字符串级 ...

  6. FileStream和BinaryReader,BinaryWriter,StreamReader,StreamWriter的区别

    FileStream对于在文件系统上读取和写入文件非常有用,FileStream缓存输入和输出,以获得更好的性能.FileStream对象表示在磁盘或网络路径上指向文件的流.这个类提供了在文件中读写字 ...

  7. 理解Javascript参数中的arguments对象

    ECMAScript中函数没有标签名的特性,所以ECMAScript函数中没有重载. Javascript中arguments的存在可以弥补javascript中函数没有重载的不足. Javascri ...

  8. Python 学习 第八篇:函数2(参数、lamdba和函数属性)

    函数的参数是参数暴露给外部的接口,向函数传递参数,可以控制函数的流程,函数可以0个.1个或多个参数:在Python中向函数传参,使用的是赋值方式. 一,传递参数 参数是通过赋值来传递的,传递参数的特点 ...

  9. BinaryReader 自己写序列化

    听说过BinaryReader和BinaryWriter吗? 序列化无非就是网络通信时所使用的传输数据的方式,而BinaryWriter可以将数据以二进制的方式写入到流当中.比如Int32型的1用Bi ...

随机推荐

  1. 使用Entity Framework时要注意的一些性能问题

    http://diaosbook.com/Post/2012/12/9/performance-issue-in-select-one-or-few-colums-via-entityframewor ...

  2. iOS视频压缩存储至本地并上传至服务器-b

    最近做了一个项目,我把其中的核心功能拿出来和大家分享一下,重点还是自己梳理一下. 这里关于视频转码存储我整理了两个方法,这两个方法都是针对相册内视频进行处理的. 1.该方法没有对视频进行压缩,只是将视 ...

  3. iOS的view翻转动画实现--代码老,供参考

    新建一个view-based模板工程,在ViewController文件中添加下面的代码,即可实现翻转效果: - (void)viewDidLoad { [super viewDidLoad]; // ...

  4. hdu 4712 Hamming Distance(随机函数暴力)

    http://acm.hdu.edu.cn/showproblem.php?pid=4712 Hamming Distance Time Limit: 6000/3000 MS (Java/Other ...

  5. [转]popwindow用法

    [转]弹出窗口的两种实现方式 PopupWindow 和 Activity  链接:http://www.cnblogs.com/winxiang/archive/2012/11/20/2778729 ...

  6. 莫名其妙的主机名 VM_32_234_centos

    在腾讯服务器上部署的时候出现的莫名其妙的错误, 我在配置文件上都写 master, node1, 但是运行mapredure的时候的时候老是出现 Job job_1409546978133_0001 ...

  7. 返回canceled 代码 的原因

    ajax 不支持跨域操作jsonp,才导致返回canceled 代码. 解决的办法就是 <script>标签.jquery 也为我们提供了$.Ajax()方法或$.getScript()方 ...

  8. DLL远程注入与卸载

    以下提供两个函数,分别用于向其它进程注入和卸载指定DLL模块.支持Unicode编码. #include <windows.h>#include <tchar.h>#inclu ...

  9. [Database]Operators

    Arithmetic Operators +,-,×,÷ Comparison Operators =,<>,!=,>,<,>=,<= BETWEEN,IN,IS ...

  10. POJ1260Pearls

    http://poj.org/problem?id=1260 题意 :这个题大概是讲,给你几种等级不同的珠宝,然后告诉你它的数量和价值,等级是升序排列的,且随等级的升高价值也随之升高,但为了防止有的客 ...