本文仅为个人理解,如有错误请指正。
本文章内容主要为数据流及相关辅助类:
流(Stream)、文件流(FileStream)、内存流(MemoryStream)、网络流(NetworkStream)、加密流(CryptoStream)以及文本读写的StreamReader、StreamWriter、用于二进制读写的BinaryReader和BinaryWriter类等。
对FileStream、MemoryStream、NetworkStream有一定的了解即可,重点熟练StreaReader、StreamWriter、BinaryReader和BinaryWirter即可。
目录
数据流
数据流的操作
分类
Stream
FileStream
MemoryStream
NetworkStream
CryptoStream
StreamReader
StreamWriter
BinaryReader
BinaryWirter
数据流(data stream)是一组有序,有起点和终点的字节的数据序列。在C#里,数据流提供了一种通用的方式和字节队列进行交互。
分为文件流(FileStream)、内存流(MemoryStream)、网络流(NetworkStream)、加密流(CryptoStream)。
分为字节流和字符流
输入流和输出流
流,在System.IO命名空间下,是所有数据流的基类,抽象类无法创建实例。
Position:获取或设置流当前的位置
Length:以字节为单位流的长度
CanWriter:当前流是否支持写入
CanTimeout:当前流是否超时
CanSeek:当前流是否支持查找,当CanSeek为false的时候,是不允许使用Position属性和调用Seek函数的,会抛出异常。
CanRead:当前流是否可读
Synckronized:根据当前流创建一个线程安全的的流对象
Close:关闭流并释放相关资源。
文件流,在System.IO命名空间下,用于对各种类型的文件进行读写。
必须调用Dispose进行资源释放。
创建FileStream:FileStream构造函数之外,也可以通过File.OpenWrite和File.OpenRead创建FileStream对象
Flush:清除流的缓冲区,将已经缓冲的数据写入文件中。
Lock:锁定当前流,防止其他进程对文件进行读写。
UnLock:解除锁定,允许其他进程对文件进行读写。
SetLength:设置流的长度。
Read:读取一个一个字节块,并写入给定的缓冲区,offset是数组的偏移量,coun为读取的字节长度。每当读取一个字节后Position会增加1。放返回值为每次读取到的实际字节数。
Seek:设置流的偏移量,offset 偏移量,origin是指定偏移量的参考位置,开始位置、结束位置、当前位置。
内存流,在System.IO命名空间下,对保存在内存中的字节数组进行操作。由于内存流的容量可以自动增长,因此在数据加密以及对长度不定的数据进行缓存等场合使用。
Capacity:获取或设置为此流分配的字节数
GetBuffer:获取流中的无符号字节数组,返回的是分配给流空间大小的字节数组(也就是Capacity大小的字节数组),而不是实际占用了的字节数组。
网络流,在System.Net.Sockets命名空间下,利用该类可以通过网络发送或接收数据。可以将NetworkStream看作在数据源和接收端之间架设了一个数据通道,读取和写入就可以针对通道来进行。
NetworkStream仅支持面向连接的套接字,也就是采用TCP协议的连接。
创建NetworkStream:构造函数参数为Socket对象或调用TcpClient对象GetStream方法得到NetworkStream
Position:网络流无法访问该属性会抛出异常
CanSeek:始终返回false
Seek:网络流无法调用该函数会抛出异常。
DataAvailable:查看缓冲区(数据缓冲区)中是否有数据等待读出。
Write:将字节数组从进程缓冲区写入到TCP发送缓冲区,Write为同步方法,会阻塞线程直到发送成功或返回异常位置。
Read:将字节数组从TCP接收缓冲区读出到进程缓冲区,调用Read之前应先判断DataAvailable属性是否为true。
加密流,在System.Security.Cryptography命名空间下,该类可加密流的方式加密或者解密数据,而且只能用于对称加密。
实现任何CryptoStream的任何被加密对象都可以和实现Stream的任何对象链接起来,因此一个对象的流式处理输出可以馈送到另一个对象的输入,而不需要分别存储中间结果。
Read:将需要解密的流写入到字节数组中,字节数组是已经解密的。
Write:将需要进行加密的流写入到字节数组中,字节数组中的数据是已经被加密的。
FlushFinalBlock:将内部缓冲区的数据进行写入并清空缓冲区。调用Flush无效。
继承自TextReader,在System.IO命名空间下。对文本数据进行读取操作时使用该类。
创建StreamReader:构造函数,参数使用FileStream、NetworkStream、MemoryStream的对象或使用文件路径。
Close:读写完成后必须使用CLose进行流的关闭.
BaseStream:获取对应的底层流,也就是创建StreamWriter或StreamReader时使用的Stream对象。
CurrentEncoding:获取当前流设置的编码格式。
ReadToEnd:从底层流的Position开始读取字符到结束为止
EndOfStream:获取底层流的Position是否为末尾为止。
继承自TextWriter,在System.IO命名空间下。对文本数据进行写入操作时使用该类。
创建StreamWriter:除构造函数外,调用File.CreateText、FileInfo.CreateText均可以获取StreamWriter对象。
AutoFlush:是否在调用Write函数后自动调用Flush函数将字符缓冲到底层流。
Flush:清除当前写入器的所有缓冲区,并使任何已缓存的数据变写入底层流。
在System.IO命名空间下,对图像文件、压缩文件等二进制数据进行读取操作时使用该类。
在System.IO命名空间下,对图像文件、压缩文件等二进制数据进行写入操作时使用该类。