BinaryReader和BinaryWriter的leaveOpen参数 z
在.NET 4.5后,微软为BinaryWriter和BinaryReader类型的构造函数中加入了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的更多相关文章
- .net 流(Stream) - StreamWriter和StreamReader、BinaryReader和BinaryWriter
转自:http://www.oseye.net/user/kevin/blog/86 一.StreamWriter和StreamReader 从上一篇博文可知文件流.内存流和网络流操作的都是字节,每次 ...
- C#中流的读写器BinaryReader、BinaryWriter,StreamReader、StreamWriter详解【转】
https://blog.csdn.net/ymnl_gsh/article/details/80723050 C#的FileStream类提供了最原始的字节级上的文件读写功能,但我们习惯于对字符串操 ...
- BinaryReader 和BinaryWriter 读写类对象
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- task可声明参数 z
直接这样写 var task1 = Task.Factory.StartNew(() => DoSomeWork(message1, message2)); 如果是winform,你在另外一个线 ...
- BinaryWriter和BinaryReader用法
C#的FileStream类提供了最原始的字节级上的文件读写功能,但我们习惯于对字符串操作,于是StreamWriter和 StreamReader类增强了FileStream,它让我们在字符串级 ...
- FileStream和BinaryReader,BinaryWriter,StreamReader,StreamWriter的区别
FileStream对于在文件系统上读取和写入文件非常有用,FileStream缓存输入和输出,以获得更好的性能.FileStream对象表示在磁盘或网络路径上指向文件的流.这个类提供了在文件中读写字 ...
- 理解Javascript参数中的arguments对象
ECMAScript中函数没有标签名的特性,所以ECMAScript函数中没有重载. Javascript中arguments的存在可以弥补javascript中函数没有重载的不足. Javascri ...
- Python 学习 第八篇:函数2(参数、lamdba和函数属性)
函数的参数是参数暴露给外部的接口,向函数传递参数,可以控制函数的流程,函数可以0个.1个或多个参数:在Python中向函数传参,使用的是赋值方式. 一,传递参数 参数是通过赋值来传递的,传递参数的特点 ...
- BinaryReader 自己写序列化
听说过BinaryReader和BinaryWriter吗? 序列化无非就是网络通信时所使用的传输数据的方式,而BinaryWriter可以将数据以二进制的方式写入到流当中.比如Int32型的1用Bi ...
随机推荐
- drag drop小游戏
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- DataTableExtensions.AsEnumerable 方法
在下面的示例中,DisplayProducts 方法接收一个数据表,其中包含名为 ProductName一个 DataColumn,提取 ProductName 值,然后输出值. using Syst ...
- bnuoj 29375 Two Strings(字符串?)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=29375 [题意]:可以对两字符串进行如下操作: 1.可以无损耗交换相邻两个字符(可以理解成交换任意字 ...
- 使用Yeoman搭建 AngularJS 应用 (11) —— 让我们搭建一个网页应用
原文地址:http://yeoman.io/codelab/prepare-production.html 让我们发布这个应用 优化产品的文件 为了创建应用的产品版本,我们想做如下的事情 检查你的代码 ...
- NSFileHandle 和 NSFileManager的一些用法
文件操作 NSFileManager 常见的NSFileManager文件的方法: -(BOOL)contentsAtPath:path 从文件中读取数据 -(BOOL)createFileAtPat ...
- PAT-乙级-1017. A除以B (20)
1017. A除以B (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求计算A/B,其中A是不超过 ...
- Unity3D 自动打包整个项目(以AssetBundle实现)
原地址:http://blog.csdn.net/huang7jiao/article/details/18370653 需求: 在移动开发中,手动控制资源的加载.释放和热更新,是很有必要的. 而Un ...
- OneAPM 云监控部署与试用体验
作为 Zabbix 骨灰级粉丝,一直以来对第三方监控(APM)都是拒绝的.一来觉得收费,二来担心数据被人所知,三来觉得 Zabbix 牛逼到无可取代.但是,随着 APM 市场的火爆,我决定「放下身段」 ...
- SSH架构简单总结
Struts.spring.Hibernate在各层的作用 1)struts 负责 web层. ActionFormBean 接收网页中表单提交的数据,然后通过Action 进行处理,再Forw ...
- SaaS系列介绍之八: SaaS的运营模式
1 引言 软件的核心是它为用户解决领域相关问题的能力. ________Eric Evans,<领域驱动设计> 传统的软件生命周期中,软件的维护占整个过程的70 ...