TextReader以及TextWriter這兩個類,非常有用,很多方法都接受它們作為參數。
TextReader有兩個子類:
- StringReader/StringWriter 用於讀取字符串;
- StreamReader/StreamWriter 用於讀取流;
一、StringReader的作用
StringReader主要用於讀取字符串。
常用方法如下:
成員 | 說明 |
Close | 關閉 StringReader |
Peek | 返回下一個可用的字符,但不使用它 |
Read | 讀取輸入字符串中的下一個字符並將該字符的位置提升一個字符,重載可提升任意個字符 |
ReadAsync | 讀取字符的指定最大數量從當前字符串異步和數據寫入緩沖區,從指定索引處開始 |
ReadBlock | 從當前文本讀取器中讀取指定數目的字符並從指定索引開始將該數據寫入緩沖區 |
ReadBlockAsync | 讀取字符的指定最大數量從當前字符串異步和數據寫入緩沖區,從指定索引處開始 |
ReadLine | 讀取一行字符從當前字符串並將數據作為字符串返回 |
ReadLineAsync | 讀取一行字符異步從當前字符串並將數據作為字符串返回 |
ReadToEnd | 讀取當前位置的任何字符。該字符串的末尾並將其返回作為一個字符串 |
ReadToEndAsync | 讀取當前位置的所有字符為字符串的結尾異步並將其返回作為一個字符串 |
示例如下:
static void Main(string[] args) { TextReader tr = new StringReader("你在他鄉還好嗎?\n很好!"); string line1 = tr.ReadLine(); //讀取一行 Console.WriteLine(line1); //你在他鄉好好嗎? string line2 = tr.ReadLine(); Console.WriteLine(line2); //很好! //注意到此處時,指針已到,末尾,注釋掉上面4行才能看到效果 //Peek()是讀,但不用,不會影響指針 while (tr.Peek() > 0) { Console.WriteLine((char)tr.Read()); //逐個讀取所有字符 } char[] charArr = new char[4]; tr.ReadBlock(charArr, 1, 3); for (int i = 0; i < charArr.Count(); i++) { Console.WriteLine(charArr[i]); } Console.ReadKey(); }
二、StreamReader的使用
StreamReader屬性:
屬性 | 說明 |
BaseStream | 返回基礎流 |
CurrentEncoding | 獲取當前 StreamReader 對象正在使用的當前字符編碼 |
EndOfStream | 獲取一個值,該值表示當前的流位置是否在流的末尾 |
StreamReader方法:
方法 | 說明 |
Close | 關閉 StreamReader 對象和基礎流,並釋放與讀取器關聯的所有系統資源 |
DiscardBufferedData | 清除內部緩沖區 |
Dispose | 釋放由 TextReader 對象使用的所有資源 |
Peek | 返回下一個可用的字符,但不使用它 |
Read | 讀取輸入流中的下一個字符並使該字符的位置提升一個字符 |
ReadAsync | 異步從當前流中讀取指定數目的字符並從指定索引開始將該數據寫入緩沖區 |
ReadBlock | 從當前流中讀取指定數目的字符並從指定索引開始將該數據寫入緩沖區 |
ReadBlockAsync | 異步從當前流中讀取指定數目的字符並從指定索引開始將該數據寫入緩沖區 |
ReadLine | 從當前流中讀取一行字符並將數據作為字符串返回 |
ReadLineAsync | 從當前流中異步讀取一行字符並將數據作為字符串返回 |
ReadToEnd | 從流的當前位置到末尾讀取所有字符 |
ReadToEndAsync | 異步讀取從當前位置到流的結尾的所有字符並將它們作為一個字符串返回 |
示例:
static void Main(string[] args) { FileStream fs = new FileStream(@"D:\123.txt",FileMode.Open,FileAccess.Read); TextReader tr = new StreamReader(fs,Encoding.Default); string str = tr.ReadToEnd(); Console.WriteLine(str); Console.ReadKey(); }
三、StringWriter的作用
StringWirter主要用於對字符串進行讀寫。
常用屬性:
屬性 | 說明 |
Encoding | 獲取將輸出寫入到其中的 Encoding |
FormatProvider | 獲取控制格式設置的對象 |
NewLine | 獲取或設置由當前 TextWriter 使用的行結束符字符串 |
常用方法:
方法 | 說明 |
Close | 關閉當前的 StringWriter 和基礎流 |
Dispose | 釋放StringWriter的資源 |
Flush | 清理當前編寫器的所有緩沖區,使所有緩沖數據寫入基礎設備 |
GetStringBuilder | 返回基礎 StringBuilder |
Write | 寫入到 StringWriter 的此實例中 |
WriteLine | 寫入重載參數指定的某些數據,后跟行結束符 |
示例:
static void Main(string[] args) { StringBuilder sb = new StringBuilder(); sb.Append("你在他鄉還好嗎?"); using (TextWriter tw = new StringWriter(sb)) { tw.WriteLine("難混啊!"); Console.WriteLine(sb.ToString()); //輸出你在他鄉還好嗎?難混啊!(后面有個換行符,Write則沒有) } Console.ReadKey(); }
四、StreamWriter的作用
StreamWriter用於將一段內容寫入到流里面,包括FileStream,MemoryStream等各種流。
屬性:
屬性 | 說明 |
AutoFlush | 獲取或設置一個值,該值指示 StreamWriter 是否在每次調用 StreamWriter.Write 之后,將其緩沖區刷新到基礎流 |
BaseStream | 獲取同后備存儲區連接的基礎流 |
Encoding | 獲取將輸出寫入到其中的 Encoding |
方法:
方法 | 說明 |
Close | 關閉當前的 StreamWriter 對象和基礎流 |
Flush | 清理當前編寫器的所有緩沖區,並使所有緩沖數據寫入基礎流 |
FlushAsync | 異步清除此流的所有緩沖區並導致所有緩沖數據都寫入基礎設備中 |
Write | 將字符寫入流 |
WriteAsync | 將字符異步寫入該流 |
WriteLine | 將字符寫入該流,並加上結束符 |
WriteLineAsync | 將行結束符異步寫入該流 |
示例:
static void Main(string[] args) { using (StreamWriter tw = new StreamWriter(@"D:\123.txt")) { tw.WriteLine("難混啊!"); Console.WriteLine(tw.BaseStream.GetType()); //輸出FileStream } Console.ReadKey(); }