1:I/O 輸入輸出
輸入對象I——————處理——————輸入對象 O
標準IO |
輸入對象:鍵盤 輸出對像:顯示器 資料在記憶體只中緩衝 |
檔案IO |
輸入:檔案 輸出:檔案 記憶體:輸入緩衝,輸出緩衝 |
記憶體IO |
輸入:記憶體 輸出:記憶體 |
其它IO如:網路IO …… |
從OS、從程式的角度來看,所謂的輸入對象,輸出對象都看成是一個檔案,鍵盤看成是一個輸入檔案,顯示其看成是一個輸出檔案,這樣可以以統一的概念來看輸入與輸出。
2:Stream 流
流(Stream)是一個抽象的概念。
電腦中的檔案主要用於存放大量的資料,可以儲存在各種輔助儲存空間中,常見的有磁碟(磁碟片和硬碟)、光碟片(CDROM和DVD)及隨身碟。與記憶體中的資料不同,即使斷電,儲存在輔助儲存空間中的檔案資料不會丟失。
檔案本身由一個個的位元0和1組成,8個二進位位(bit)構成一個位元組(Byte),位元組是檔案儲存體的最小單位。
不管檔案中儲存的是什麼資料,電腦都可以把它看成是一個二進位的位元組流。
對檔案內容進行的所有操作,就體現在對這些位元據的讀和寫兩個操作上。儲存在檔案中的位元據是有序的,從檔案開始到結束,不能隨意更改去次序,就像是一條小溪流中的水一樣,是不可能倒流的。因此,在軟體中,常把檔案看成是一個資料的“小溪”,用“檔案流(File Stream)”這個概念來代表。
Stream 是所有流的抽象基類。流是位元組序列的抽象概念,例如檔案、輸入/輸出裝置、內部進程通訊管道或者 TCP/IP 通訊端。Stream 類及其衍生類別提供這些不同類型的輸入和輸出的一般視圖,使程式員不必瞭解作業系統和基礎裝置的具體細節。
流,輸入資料流,輸出資料流 標準流,檔案流,記憶體流,網路流
如:.NET中我們建立一個檔案流對象時候,對象就會有個資料緩衝,還有檔案控制代碼(指標,對應的是非託管資源,指明了流的輸出或是輸入對象,還有輸出或是讀取位置的指標,它會移動) 調用 流.Write(..)方法時候,先將資料寫入資料緩衝區,然後在一定的機制下將緩衝中的資料寫入輸出對象,也可以調用Flush()方法將緩衝資料強制放入到輸出對象,然後清空緩衝區內容。
(1)標準流 如:C++中 cout cin cerr clog .NET中的Console(它包括這四種對象)
cout:console output 標準輸出資料流對象 cout<< ‘d’<<’f’ 向緩衝區中插入資料
cin : console input 標準輸入資料流對象 cin>>a>>b 鍵盤輸入資料後放入資料緩衝區,提取資料放入變數a b 提取資料有一定的規則
cout << ----Console..Write cout >>endl---Stream.Flush
(2)檔案流
。檔案流的操作主要就是讀寫和與讀寫有關的檔案指標的一些操作
。如何來理解讀寫的位置呢?
寫的時候可以這樣理解:寫的資料先放在資料緩衝中,緩衝資料寫入檔案是根據根據檔案流設定的讀寫位置來將資料插入檔案
(3)記憶體流
3 .NET 中的 流
(1).NET 中流的繼承結構
System.Object
System.MarshalByRefObject
System.IO.Stream[以下是常見的]
System.IO.BufferedStream
System.IO.FileStream
System.IO.MemoryStream
System.Net.Sockets.NetworkStream
(2)建立在流基礎上的流操作類型【流讀寫器】
BinaryReader : IDisposable
BinaryWriter : IDisposable
TextReader : MarshalByRefObject, IDisposable
TextWriter : MarshalByRefObject, IDisposable
StreamReader : TextReader
StreamWriter : TextWriter
StringReader : TextReader
StringWriter : TextWriter
說明:流對象 vs 流讀寫對象
>流對象本身包括一些基本的流操作方法,只支援位元組的讀寫
>流讀寫對象,它可用特定的編碼來讀寫,支援複雜的讀寫操作
>流讀寫對象也有自己的緩衝區
>原理:如 建立在FileStream上的BinaryWriter. 顯然BinaryWriter包含FileStream對象的引用,當往BinaryWriter對象寫入資料的時候,它在內部將資料緩衝在自己的緩衝區,當滿時,BinaryWriter對象將資料寫入FileStream,。
若顯示關閉BinaryWriter時候,它會將自己的緩衝資料寫入到FileStream對象,然後調用關聯的FileStream對象的關閉,FileSream關閉時候,先要將資料寫入輸出端,然後調用Win32的closeHandler函數來釋放非託管的資源。