本章节的学习目标:
- 了解读写内存流MemoryStream的特点
- 学习如何建立内存流MemoryStream
- 了解读写缓存流BufferedStream
- 学习如何建立缓存流BufferedStream
前面的章节介绍了文件流FileStream,什么是流?在.NET程序中,涉及的输入和输出都是通过流来实现的。流是串行化设备的抽象表示,以读/写字节的方式从存储器读/写数据。存储器是存储媒介,磁盘或内存都是存储器。正如除磁盘外还存在着多种存储器,除文件流之外也存在多种流,例如网络流、内存流、缓存流等。Stream类及其派生类组成流的家族。
所有流的类都是从Stream类派生出来的。Stream类是所有流的抽象基类,所以它不能被实例化为对象,只能通过变量引用派生类的对象。Stream变量所引用对象具有以下一种或多种功能。
- 读:通过Read()或ReadByte()方法实现读数据:
- 写:通过Write()或WriteByte()方法实现写数据;
- 定位:通过Position属性和Seek()方法实现定位。
派生的流对象只能支持这些功能中的一部分,例NetworkStream不支持定位。可以利用从Stream派生出来的对象的CanRead、CanWrite和CanSeek属性判断流对象支持哪些操作。
另外,对于MemoryStream类,有两点需要说明
- 对内存而不是对磁盘进行数据读写
- 减少了对临时缓冲区和文件的需要
而对于BufferedStream类,有四点需要说明:
- 对缓冲区进行数据读写
- 允许操作系统创建自己的缓冲区
- 输入/输出效率高且速度更快
- 在网络通讯的时候经常会使用到
3.5.1 读写内存流——MemoryStream类
MemoryStream类创建这样的流:该流以内存而不是磁盘或网络连接作为支持存储区。 MemoryStream类封装以无符号字节数组形式存储的数据,该数组在创建MemoryStream对象时被初始化,或者该数组可创建为空数组。可在内存中直接访问这些封装的数据。内存流可降低应用程序中对临时缓冲区和临时文件的需要。
FileStream对象与MemoryStream对象有很大区别,主要体现在以下方面:
(1)FileStream对象的数据来自文件,而MemoryStream对象的数据来自内存缓冲区;这两个
类都继承自Stream类。
(2)MemoryStream的数据来自内存中的一块连续区域,这块区域称为缓冲区(Buffer)”。可以把缓冲区看成一个数组,每个数组元素可以存放一个字节的数据。
(3)在创建MemoryStream对象时,可以指定缓冲区的大小,并且可以在需要的时候更改。
类的构造函数有7种,我们这里重点介绍3种。
内存流对象还有一些重要的属性。其中Length属性代表了内存流对象存放的数据的真实长度而Capacity属性则代表了分配给内存流的内存空间大小。可以使用字节数组创建一个固定大小的 MemoryStream。
Memorystream mem=new MemoryStream(buffer);//这时,无法再设置capacity属性的大小
Memorystream mem=new Memorystream(buffer,false);//这时,canwrite属性就被设置为false
创建一个项目,从工具箱中拖拽五个label控件和一个Button控件到Form窗口上。
Button按钮click事件测试代码:

暂无评论内容