首页 > 代码库 > 关于 流(Stream) 的概念理解

关于 流(Stream) 的概念理解

什么是流,我认为流就是对IO设备的一种抽象。流将各种千差万别的设备统一抽象成一种模型,向用户提供一个统一的编程接口,用户无需了解设备内部细节,就可完成对设备的IO操作,大大简化开发难度。

流这个概念很重要,很大一部分初涉猎编程的人(包括我),犯眼高手低的错误,认为流不就是对控制台,文件的读写操作吗?其实不然,流也是一个非常重要的编程思想,就像面向对象一样,要深刻理解贯彻在脑子里。要具备对 流 足够的理论知识,才能游刃有余的面对各种数据IO问题。

废话少说。

 

c#语言里,所有的流类型 的基类是 Stream。

Stream是以一个抽象类,由它派生的常用类有:

 

MemoryStream:对内存进行读取与写入 

BufferedStream:对缓冲器进行读取/写入 

FileStream:对文件执行读取与写入

 

流作为对IO设备的一种抽象,不仅是对设备数据的一种缓冲容器,自然也应该具备对设备的读写操作,基本方法有:

Read/Write :读写buffer

ReadByte/WriteByte:读写字节

Seek:设置读写位置

由于流的读写操作有功能上的局限性,所以对流有 Reader/Writer,来丰富对流的读写操作。

c#有TextReader/Writer,BinaryReader/Writer,顾名思义分别为字符流读写和字节流读写。

其中TextReader/Writer是一个抽象类,由它派生的有StreamReader/Writer,StringReader/Writer,后者不对流进行读写操作,所以一般常用前者来读写字符流。

BinaryReader/Writer可以直接拿来用。

 

其他:

我觉得 流 更像是用户与设备之间的“数据通道”,是一种数据的中间容器,不一定缓存设备中的所有数据,但可以允许用户访问设备的所有数据。

其实所有的问题来自于:为什么WebResponse的最终返回给用户的是一个stream,而不是string?

一个解释是response流不一定是字符流,也可以是字节流(这一点确实之前太先入为主了,总是认为服务端返回的是一组字符串)

其二是当response流数据量较大时,考虑到性能问题,不可能一下子将所有数据拿回到用户端上,用流来做中间缓冲。

关于 流(Stream) 的概念理解