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類,直接讀寫二進制數據。