什么是流,我认为流就是对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流数据量较大时,考虑到性能问题,不可能一下子将所有数据拿回到用户端上,用流来做中间缓冲。