在.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. 硬盘4k对齐教程总结

    4k对齐概念: 4K对齐相关联的是一个叫做“高级格式化”的分区技术.首先先来了解一下什么是叫做“4K 对齐”.其实“4K对齐”相关联的是一个叫做“高级格式化”的分区技术.“高级格式化”是国际硬盘设备与 ...

  2. [SQL SERVER系列]之嵌套子查询和相关子查询

    子查询有两种类型,一种是只返回一个单值的子查询,这时它可以用在一个单值可以使用的地方,这时子查询可以看作是一个拥有返回值的函数:另外一种是返回一列值的子查询,这时子查询可以看作是一个在内存中临时存在的 ...

  3. play2 控制台打印乱码问题

    修改 play安装目录下,framework/build.bat java -Xms512M -Xmx1024M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:Ma ...

  4. select count(*)和select count(1)的区别 (转)

    A 一般情况下,Select Count (*)和Select Count(1)两着返回结果是一样的 假如表沒有主键(Primary key), 那么count(1)比count(*)快, 如果有主键 ...

  5. jQuery列表拖动排列-jquery list dragsort插件参数和使用方法

    在编写网页的时候,有时可能需要对ul的li进行排序,今天就给大家推荐使用jquery插件jquery list dragsort实现列表拖动排序效果. 效果如图: jquery list dragso ...

  6. spring中注解事务认识

    1.配置事务管理器 <!-- 设定transactionManager事务管理器 --> <bean id="txManager" class="org ...

  7. 【无聊放个模板系列】BZOJ 1597 斜率优化

    STL 双向队列DEQUE版本 #include<cstdio> #include<cstdlib> #include<cstring> #include<i ...

  8. Protected Functions 是理解OO的难点和关键

    Protected Functions 是理解OO的难点和关键 private和public函数都好理解,这里就不多说了,夹在中间的prortected却有许多精妙之处,说说我的几个疑问和看法:1. ...

  9. WPF之小动画一

    定义动画: 直接使用Element进行BeginAnimation DoubleAnimation animation = new DoubleAnimation(); animation.By = ...

  10. python脚本工具 - 3 目录遍历

    遍历系统中某一目录下的所有文件名 #! /usr/bin/python # coding:utf-8 import os def dirList(path): filelist = os.listdi ...