.NET
Framework带给开发人员的困难之一是一个关于流的IO系统。该系统对于VB程序员来讲是全新的,也就是说那些VB程序员很可能除了FileSystemObject外,不曾接触过流。而其他语言在几年前就已经有IO流了。接下来让我们深入探讨一下.NET对流的支持。
什么是流?为什么要关注它?
流是一种抽象的发送和接受数据的方法。当你处理一个流时,你只需要把精力集中在端点——从一个流中读取数据,或是向一个流中发送数据时的起始位置。你不需要考虑这个流的另一端是什么,数据是如何传送到这个流的另一端的,甚至当一个流到达时它是什么样的格式。流使你的应用程序有相当大的灵活性,允许你与内存,控制台,甚至是一个网络连接之间进行读写操作,就好像那个网络连接只是一个简单的磁盘文件。
.NET Framework有许多不同形式的流,以适应各种不同的环境。表A列出了主要的几种流。它们都属于System.IO.Stream类,该类的成员本身支持基本IO功能,比如读,写,以及改变你在流中的当前位置,也就是通常说的Seek。Stream还支持同步操作和异步操作,允许你在后台进行冗长的IO操作。
表A
流 |
说明 |
缓冲数据在另一个流上的读写;通过把数据缓存在内存中来提高读写性能 |
|
允许对一个文件进行读写操作 |
|
允许对一个内存区块进行读写操作;适用于临时存储 |
|
允许对一个网络终端进行读写操作 |
|
向一个密码操作提供流输入/输出;可以和其他流连接,使加密变得相对更简单 |
Stream的主要分支
处理和输入你的流
除非你不了解VB过去的文件读取过程,否则你会发现读取和写入到数据流其实是一个相当直接的过程。列表A通过一个例子阐明了用FileStream读写一个假定的文本文件的过程。所有Stream对象都通过它们的Read和Write函数支持读写操作。然而,这些函数只能接受字节数组。虽然有时这正是你所需要的,但是当你处理一个简单的文本文件时,就像我在列表A中举的那个例子一样,这就使你不得不再做一些额外的工作——正如我在使用静态System.Text.Encoding.ASCII函数时所做的那样。
在这个例子中你还要注意到没有任何办法可以从一个流中读取整个数组或是向一个流写入一个完整的数组。你必须用offset和length参数来指出起始位置和字节数以读取或写入一个流。这将可能溢出一个流,或是试图从一个流中读取多于这个流所能提供的字节的内容。但事实上这并不会成为一个问题,因为任何额外的数组元素在Read过程结束后都会被置空。