C# 数据流详解(FileStream、MemoryStream、NetworkStream等类)

本文仅为个人理解,如有错误请指正。

本文章内容主要为数据流及相关辅助类:

流(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#里,数据流提供了一种通用的方式和字节队列进行交互。

数据流的操作

  • 逐字节顺序写入(将数据从内存缓冲传出到外部资源)
  • 逐字节顺序读取(将数据从外部数据资源传输到内存缓冲区)
  • 随机读写(从某个位置开始逐字顺序读写)

分类

  • 根据数据源的类型(C#语言采用这种方式进行分类)

分为文件流(FileStream)、内存流(MemoryStream)、网络流(NetworkStream)、加密流(CryptoStream)。

  • 根据读写数据的类型

分为字节流和字符流

  • 根据输入输出方向

输入流和输出流

Stream

流,在System.IO命名空间下,是所有数据流的基类,抽象类无法创建实例。

Position:获取或设置流当前的位置

Length:以字节为单位流的长度

CanWriter:当前流是否支持写入

CanTimeout:当前流是否超时

CanSeek:当前流是否支持查找,当CanSeek为false的时候,是不允许使用Position属性和调用Seek函数的,会抛出异常。

CanRead:当前流是否可读

Synckronized:根据当前流创建一个线程安全的的流对象

Close:关闭流并释放相关资源。

FileStream

文件流,在System.IO命名空间下,用于对各种类型的文件进行读写。

必须调用Dispose进行资源释放。

创建FileStream:FileStream构造函数之外,也可以通过File.OpenWrite和File.OpenRead创建FileStream对象

Flush:清除流的缓冲区,将已经缓冲的数据写入文件中。

Lock:锁定当前流,防止其他进程对文件进行读写。

UnLock:解除锁定,允许其他进程对文件进行读写。

SetLength:设置流的长度。

Read:读取一个一个字节块,并写入给定的缓冲区,offset是数组的偏移量,coun为读取的字节长度。每当读取一个字节后Position会增加1。放返回值为每次读取到的实际字节数。

Seek:设置流的偏移量,offset 偏移量,origin是指定偏移量的参考位置,开始位置、结束位置、当前位置。

MemoryStream

内存流,在System.IO命名空间下,对保存在内存中的字节数组进行操作。由于内存流的容量可以自动增长,因此在数据加密以及对长度不定的数据进行缓存等场合使用。

Capacity:获取或设置为此流分配的字节数

GetBuffer:获取流中的无符号字节数组,返回的是分配给流空间大小的字节数组(也就是Capacity大小的字节数组),而不是实际占用了的字节数组。

NetworkStream

网络流,在System.Net.Sockets命名空间下,利用该类可以通过网络发送或接收数据。可以将NetworkStream看作在数据源和接收端之间架设了一个数据通道,读取和写入就可以针对通道来进行。

NetworkStream仅支持面向连接的套接字,也就是采用TCP协议的连接。

创建NetworkStream:构造函数参数为Socket对象或调用TcpClient对象GetStream方法得到NetworkStream

Position:网络流无法访问该属性会抛出异常

CanSeek:始终返回false

Seek:网络流无法调用该函数会抛出异常。

DataAvailable:查看缓冲区(数据缓冲区)中是否有数据等待读出。

Write:将字节数组从进程缓冲区写入到TCP发送缓冲区,Write为同步方法,会阻塞线程直到发送成功或返回异常位置。

Read:将字节数组从TCP接收缓冲区读出到进程缓冲区,调用Read之前应先判断DataAvailable属性是否为true。

CryptoStream

加密流,在System.Security.Cryptography命名空间下,该类可加密流的方式加密或者解密数据,而且只能用于对称加密。

实现任何CryptoStream的任何被加密对象都可以和实现Stream的任何对象链接起来,因此一个对象的流式处理输出可以馈送到另一个对象的输入,而不需要分别存储中间结果。

Read:将需要解密的流写入到字节数组中,字节数组是已经解密的。

Write:将需要进行加密的流写入到字节数组中,字节数组中的数据是已经被加密的。

FlushFinalBlock:将内部缓冲区的数据进行写入并清空缓冲区。调用Flush无效。

StreamReader

继承自TextReader,在System.IO命名空间下。对文本数据进行读取操作时使用该类。

创建StreamReader:构造函数,参数使用FileStream、NetworkStream、MemoryStream的对象或使用文件路径。

Close:读写完成后必须使用CLose进行流的关闭.

BaseStream:获取对应的底层流,也就是创建StreamWriter或StreamReader时使用的Stream对象。

CurrentEncoding:获取当前流设置的编码格式。

ReadToEnd:从底层流的Position开始读取字符到结束为止

EndOfStream:获取底层流的Position是否为末尾为止。

StreamWriter

继承自TextWriter,在System.IO命名空间下。对文本数据进行写入操作时使用该类。

创建StreamWriter:除构造函数外,调用File.CreateText、FileInfo.CreateText均可以获取StreamWriter对象。

AutoFlush:是否在调用Write函数后自动调用Flush函数将字符缓冲到底层流。

Flush:清除当前写入器的所有缓冲区,并使任何已缓存的数据变写入底层流。

BinaryReader

在System.IO命名空间下,对图像文件、压缩文件等二进制数据进行读取操作时使用该类。

BinaryWirter

在System.IO命名空间下,对图像文件、压缩文件等二进制数据进行写入操作时使用该类。

 

你可能感兴趣的:(类)