I/O系統從某種意義上來說可分為兩大類,一是控制台,而是檔案系統,包含顯示器,硬碟等。在C#中是通過資料流的方式來進行I/O操作的。什麼是資料流呢?資料流是一種對產生和使用資訊的抽象。在C#中,I/O操作的最小單位是位元組,因為大多數裝置在進行I/O操作時都是基於位元組的。而對於人來說,我們常常習慣於使用字元來進行通訊。C#中含有兩種基本資料流,即位元組資料流和字元資料流,同時也提供了一些類用於兩者之間的轉換。
.NET Framework中定義了位元組資料流類和字元資料流類,而所有的核心資料流類都是在System.IO名稱空間中,如果需要使用這些類需要使用下面的語句,
using System.IO
由於Console類定義在System名稱空間中,所以不需要為控制台的輸入輸出指定System.IO名稱空間。
(一)資料流類
C#中的核心資料流類是System.IO.Stream,Stream類是所有資料流類的基類,它是一個抽象類別,不能執行個體化。下面介紹一下其包含的常用的方法和常用屬性。
方法 |
說明 |
void Close() |
關閉資料流 |
void Flush() |
向物理裝置寫入資料流中的內容 |
int ReadByte() |
返回輸入資料流中的下一個可用位元組的整數表示,到達檔案末尾時返回-1 |
int Read(byte[] buffer,int offset,int count) |
試著讀取count個位元組,並從buffer[offset]開始將資料寫入buffer數組,返回成功讀取的位元組數 |
long Seek(long offset,SeekOrigin origin) |
在資料流中將當前位置設定在origin+offset處,返回新的地址 |
void WriteByte(byte value) |
把單個位元組輸入資料流中 |
int Read(byte[] buffer,int offset,int count) |
把數組buffer中從buffer[offset]開始的count個位元組寫入輸出資料流,返回寫入的位元組數 |
屬性 |
說明 |
bool CanRead |
如果資料流可讀,屬性為真,唯讀屬性 |
bool CanWrite |
如果資料流可寫,屬性為真,唯讀屬性 |
bool CanSeek |
如果資料流支援位置請求,屬性為真,唯讀屬性 |
bool Position |
該屬性提供資料流的當前位置,讀寫屬性 |
bool Length |
該屬性提供資料流的長度,讀寫屬性 |
bool CanTimeout |
如果資料流支援逾時操作,屬性為真,唯讀屬性 |
int ReadTimeout |
該屬性指定讀操作的逾時時間,讀寫屬性 |
int WriteTimeout |
該屬性指定寫操作的逾時時間,讀寫屬性 |
從Stream類派生出一些具體的位元組資料流類,這些資料流類都定義在System.IO名稱空間中,包括BufferedStream類,FileStream類,MemoryStream類和UnmanagedMemoryStream類。
要建立字元資料流,需要將位元組資料流封裝在一個C#字元資料流封裝類中。字元資料流階層的最頂層是抽象類別TextReader和TextWriter,所有的衍生類別都必須實現這兩個抽象類別所定義的方法。
TextReader類定義的輸入方法有:
方法 |
說明 |
int Peek() |
從輸入資料流中擷取下一個字元,但是不移除該字元,如果沒有可用字元,則返回-1 |
int Read() |
返回輸入資料流中的下一個可用字元的整數形式,當到達資料流末端時返回-1 |
int Read(char[] buffer,int index,int count) |
嘗試讀取count個字元,並從buffer[index]開始將資料寫入buffer數組,返回成功讀取的字元個數 |
int ReadBlock(char[] buffer,int index,int count) |
嘗試讀取count個字元,並從buffer[index]開始將資料寫入buffer數組,返回成功讀取的字元個數 |
string ReadLine() |
讀取下一行文本並將其作為字串返回,如果試圖在文本末尾進行讀取,就返回null |
string ReadToEnd() |
讀取資料流中從當前位置到結尾的所有字元,並將其作為字串返回 |
TextWriter類定義了各種版本的Write函數和WriteLine函數。除了這些函數,TextWriter類還定義了Close()和Flush()函數。其中,Flush()函數用於將輸出緩衝區中的資料寫入物理介質中,而Close()函數用於關閉寫入程式並釋放資源。
TextReader和TextWriter類作為抽象類別,由一些基於字元的資料流類來實現。這些資料流包括StreamReader,StreamWriter,StringReader和StringWriter。
除了上面介紹的位元組資料流和字元資料流外,C#中還定義了一種位元據流,BinaryReader和BinaryWriter類,直接讀寫位元據。