10.5 流
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
简单理解流像是一页纸张,根据需要写入的内容这页纸可以很大,也可以很小,可以向纸张上面写入(Write)内容(通常是字节形式的数据),写入的位置(Position)随写入内容而增加相应数量;同时也可以从纸上已有内容的某个位置读取(Read)已经写入的内容,读取的位置(Position)也随读取内容而增加相应数量。已经有的内容是不能裁剪掉的,但是可以从已经写入内容的某个位置(Position)开始,用新的内容覆盖原有内容。
10.5.1 Stream(数据流)类
Stream类是C#中数据读取最基本的概念,是所有流的抽象基类。它包含了三类基本操作:
1、读取:从流到数据结构(如字节数组)的数据传输。
2、写入:从数据源到流的数据传输。
3、查找:对流内的当前位置进行的查询和修改。
根据基础数据源或储存库,流可能只支持这些功能中的一部分。例如:NetworkStream不支持查找。
Stream常用属性:
- CanRead:只读属性,当前流是否可读取。
- CanSeek:只读属性,当前流是否支持查找功能的值。
- CanTimeout:只读属性,当前流是否可以超时,这个属性总是返回False。
- CanWrite:只读属性,当前流是否可写入。
- Length:只读属性,流长度(字节)。
- Position:当前流中读写的位置。
- ReadTimeout:确定流在超时前尝试读取多长时间(毫秒)。
- WriteTimeout:确定流在超时前尝试写入多长时间(毫秒)。
一般而言,并不是所有的流都支持读、写、定位操作,读写文件时候都应该检查是否可读(CanRead)、可写(CanWrite)、可设置流当前位置(CanSeek)。
当CanRead为False时,不能使用Read及相关方法;当CanWrite为False时,不能使用Write及相关方法;当CanSeek为False时,不能使用Seek方法。
如果向只读的数据流写入数据,或者读取只写的数据流,都会引发系统错误。
Stream常用方法:
- BeginRead :开始异步读操作。
- BeginWrite :开始异步写操作。
- EndRead :等待挂起的异步读取完成。
- EndWrite :结束异步写操作。
- Flush :将清除该流的所有缓冲区,并使得所有缓冲数据被写入到基础设备。
- Read :从当前流读取字节序列,并将此流中的位置提升读取的字节数。
- Write :向当前流中写入字节序列,并将此流中的当前位置提升写入的字节数。
- ReadByte :从流中读取一个字节,并将流内的位置向前推进一个字节,如果已到达流的末尾,则返回 -1。
- WriteByte :将一个字节写入流内的当前位置,并将流内的位置向前推进一个字节。
- CopyTo:从当前流中读取字节并将其写入到另一流中。
- Seek :设置当前流中数据指针的位置,程序将根据指针位置进行读写操作。
- Close :关闭当前流并释放与之关联的所有资源(如套接字和文件句柄),打开或创建了文件必须Close方法。
10.5.1.1 Stream类的子类
Stream类有如下几个常见子类:
- FileStream:文件流,读写文件里面的数据。
- MemoryStream:内存流,读写内存里的数据
- NetworkStream:网络流,读写网络传输数据。
- CryptoStream:加密流,用于数据的加密与解密。
- GzipStream和DeflateStream:压缩流,用于数据的压缩与解压缩。
流在实际使用时候,应使用它的具体相关的子类。
10.5.1.2 同步和异步
从.NET Framework 4.5开始, C#在Stream的子类中提供新的异步方法,包括 ReadAsync,WriteAsync, CopyToAsync,和FlushAsync,新的异步方法将逐渐取代BeginRead和BeginWrite。这些方法使您可以执行占用大量资源的 I/O 操作而不会阻塞主线程。在程序中一个耗时的流操作可能阻塞UI线程并让应用看起来好像卡死,因此这个时候就可以考虑使用异步。
同步:指的是在一个操作完成之前,接下来的操作必须等待上一个操作结束,才能继续。
异步:指的是主线程可以继续进行其他工作,稍后,用户将能够处理数据。
具体的异步读写文件操作请参看第10.6.1.3节。
10.5.2 FileStream(文件流)类
FileStream类为文件读写操作提供流,继承于Stream类。
FileStream常用属性:
- IsAsync 获取一个值,该值指示 FileStream 是异步还是同步打开的。
FileStream常用构造函数:
- FileStream(String, FileMode, FileAccess):使用指定的文件路径、创建模式和读写权限初始化FileStream类的新实例。
第一个参数是指定的文件的路径。
第二个参数是一个FileMode枚举,指定了打开文件的方式,包括以下成员:
- Append:文件存在,则打开文件并将读写位置放置到文件尾;否则创建一个新文件。
- Create:创建新文件。 如果文件已存在,它将被覆盖。
- CreateNew:创建新文件, 如果文件已存在则引发异常。
- Open:打开现有文件,如果文件不存在则引发异常。
- OpenOrCreate:文件存在就打开文件;否则创建新文件。
- Truncate:打开现有文件并清除内容,如果文件不存在则引发异常。
第三个参数是一个FileAccess枚举,指定了文件读写权限,包括以下成员:
- Read:文件的读访问。可与 Write 组合从文件中读取数据。
- Write:文件的写访问。 可Read 组合将数据写入文件。
- ReadWrite:对文件的读访问和写访问。
- FileStream(String, FileMode, FileAccess, FileShare):使用指定的路径、创建模式、读/写权限和共享权限初始化FileStream类的新实例。
前三个参数和上面的重载相同。
第四个参数是一个FileShare枚举,指定了其它FileStream对象对同一文件可以的操作方式,包括以下成员:
- Delete:允许随后删除文件。
- Inheritable:使文件句柄可由子进程继承。
- None:谢绝共享当前文件。
- Read:允许随后打开文件读取。
- ReadWrite:允许随后打开文件读取或写入。
- Write:允许随后打开文件写入。
FileStream常用方法:
- Lock:防止其他进程读取或写入 FileStream。
- Unlock:允许其他进程访问以前锁定的某个文件的全部或部分。
- ReadAsync:从当前流异步读取字节序列,并将流中的位置提升读取的字节数。
- WriteAsync:将字节序列异步写入当前流,并将流的当前位置提升写入的字节数。
学习更多vb.net知识,请参看vb.net 教程 目录
学习更多C#知识,请参看C#教程 目录