在.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. SQL学习中(一)序列

    序列可以理解数值序列生成器,通俗的说是按照已经设定的规则自动产生数据的方案对象.--SQL SERVER不支持 个人认为序列类似于SQLSERVER中的identity(1,1),可以用于在表中添加数 ...

  2. EXTJS 4.2 资料 控件之Grid 列鼠标悬停提示

    columns: [ { header: }, { header: }, { header: , renderer: function (v, ctx, record) { ctx.tdAttr = ...

  3. keystone命令与client接口学习

    keystone学习 ------------------ Keystone(OpenStack Identity Service)是OpenStack框架中,负责身份验证.服务规则和服务令牌的功能, ...

  4. Linux 配置Samba

    配置Samba 如果没有普通用户,添加用户,指令: useradd -m aaa passwd bbb 添加Samba用户指令: smbpasswd -a aaa passwdword: …… 修改配 ...

  5. 1023: [SHOI2008]cactus仙人掌图 - BZOJ

    Description如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路 ...

  6. iOS 屏幕旋转 nav+tabbar+present(网页) 2016

    如题,最近一个app架构为 nav + tabbar ,需求是 在点击tabbar中的一个菜单项时,弹出网页,该网页需要横屏显示,其他页面不变  都保持竖屏. XCode Version 7.2.1 ...

  7. MVC 自定义AuthorizeAttribute 实现权限验证

    MVC内置的AuthorizeFilter先于Action/Result过滤器执行,为网站权限验证提供了很好的一套验证机制. 通过自定义的AuthorizeAttribute可以实现对用户权限的验证. ...

  8. uva 10271

    DP  状态转移方程 dp[i][j] = min(dp[i-1][j], dp[i-2][j-1] + w)) dp[i][j] 指的是前i个筷子组成j组所花费的最小值 考虑第i个筷子是否参与第j组 ...

  9. sqlmap映射继承机制及映射字段顺序与SQL查询字段顺序无关

    <typeAlias alias="TblSpPartsinfo" type="com.bn.car.biz.supply.dao.po.PartsInfoPO&q ...

  10. Nagios Apache报Internal Server Error错误的解决方法

    今天配置Nagios的时候遇到了一些麻烦,前面的步骤都一切顺利,nagios运行后,可以看到nagios的主页,但点击左边的菜单时总是提示Internal Server Error错误.错误如下: v ...