關於 流(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) 的概念理解