StreamReader實現了抽象基類TextReader類,而StreamWriter實現了抽象基類TextWriter。分別用於對流的讀取與寫入。
先從StreamReader說起
一、構造方法
StreamReader(Stream) 為指定的流初始化 StreamReader 類的新實例。
StreamReader(String) 為指定的文件名初始化 StreamReader 類的新實例。
StreamReader(Stream, Boolean) 用指定的字節順序標記檢測選項,為指定的流初始化 StreamReader 類的一個新實例。
StreamReader(Stream, Encoding) 用指定的字符編碼為指定的流初始化 StreamReader 類的一個新實例。
StreamReader(String, Boolean) 為指定的文件名初始化 StreamReader 類的新實例,帶有指定的字節順序標記檢測選項。
StreamReader(String, Encoding) 用指定的字符編碼,為指定的文件名初始化 StreamReader 類的一個新實例。
StreamReader(Stream, Encoding, Boolean) 為指定的流初始化 StreamReader 類的新實例,帶有指定的字符編碼和字節順序標記檢測選項。
StreamReader(String, Encoding, Boolean) 為指定的文件名初始化 StreamReader 類的新實例,帶有指定的字符編碼和字節順序標記檢測選項。
StreamReader(Stream, Encoding, Boolean, Int32) 為指定的流初始化 StreamReader 類的新實例,帶有指定的字符編碼、字節順序標記檢測選項和緩沖區大小。
StreamReader(String, Encoding, Boolean, Int32) 為指定的文件名初始化 StreamReader 類的新實例,帶有指定字符編碼、字節順序標記檢測選項和緩沖區大小。
二、公共屬性
BaseStream 返回基礎流。
CurrentEncoding 獲取當前 StreamReader 對象正在使用的當前字符編碼。
EndOfStream 獲取一個值,該值表示當前的流位置是否在流的末尾。
三、公共方法
Close 關閉 StreamReader 對象和基礎流,並釋放與讀取器關聯的所有系統資源。 (重寫 TextReader..::.Close()()()。)
CreateObjRef 創建一個對象,該對象包含生成用於與遠程對象進行通信的代理所需的全部相關信息。 (繼承自 MarshalByRefObject。)
DiscardBufferedData 允許 StreamReader 對象丟棄其當前數據。
Dispose 已重載。
GetLifetimeService 檢索控制此實例的生存期策略的當前生存期服務對象。 (繼承自 MarshalByRefObject。)
InitializeLifetimeService 獲取控制此實例的生存期策略的生存期服務對象。 (繼承自 MarshalByRefObject。)
MemberwiseClone 已重載。
Peek 返回下一個可用的字符,但不使用它。 (重寫 TextReader..::.Peek()()()。)
Read 已重載。 讀取輸入流中的下一個字符或下一組字符。
ReadBlock 從當前流中讀取最大 count 的字符並從 index 開始將該數據寫入 buffer。 (繼承自 TextReader。)
ReadLine 從當前流中讀取一行字符並將數據作為字符串返回。 (重寫 TextReader..::.ReadLine()()()。)
ReadToEnd 從流的當前位置到末尾讀取流。 (重寫 TextReader..::.ReadToEnd()()()。)
以下是StreamReader類的示例代碼:
static void Main(string[] args) { FileStream fs = new FileStream(@"D:\text.txt", FileMode.Open, FileAccess.Read); StreamReader sr = new StreamReader(fs); Stream stream = sr.BaseStream; //返回基流 Console.WriteLine(stream.GetType()); //輸出 System.IO.FileStream Console.WriteLine(sr.CurrentEncoding); //當前流讀取器使用的編碼,默認是本機編碼(當構造器不指定時),如果構造方法指定了,輸出的就是構造方法指定的編碼 Console.WriteLine(sr.EndOfStream); //輸出False 指示當前流的位置是否在流的結尾 string str = sr.ReadToEnd(); //此方法對於不能使用Length的流非常有用,比如壓縮流 從當前位置讀取到流結尾 Console.WriteLine(str); //輸出 D:\text.txt文本的內容 fs.Seek(3, SeekOrigin.Begin); //便宜開始為3,UTF8,1個字節占用4個字符(0,1,2,3) string str1 = sr.ReadLine(); //輸出D:\text.txt的第一行文本 Console.WriteLine(str1); string str2 = sr.ReadLine(); Console.WriteLine(str2); //輸出D:\text.txt 的第二行文本 Console.WriteLine("-----------------------"); fs.Seek(3, SeekOrigin.Begin); char[] chars = new char[10]; sr.Read(chars, 0, 10); //將前11個字符讀取到 字符數組 (從0開始) for (int i = 0; i < chars.Length; i++) { Console.WriteLine(chars[i]); } Console.WriteLine("=============="); Console.WriteLine(Convert.ToChar(sr.Read())); //輸出的數字,要轉換為字符之后才是下一個字符 using (StreamReader sr1 = new StreamReader(@"D:\text.txt", Encoding.UTF8)) { int s = 0; while ((s = sr1.Read()) != -1) //注意要用個int s來記錄讀取到的字符,因為每調用一次Read()方法,位置都會前進一位 { Console.Write(Convert.ToChar(s)); //輸出所有字符 } } Console.WriteLine(".................."); using (StreamReader sr3 = new StreamReader(@"D:\text.txt", Encoding.UTF8)) { Console.WriteLine(Convert.ToChar(sr3.Peek())); //輸出 文本的第一個字 } Console.ReadKey(); }
StreamWriter類
一、屬性
AutoFlush 獲取或設置一個值,該值指示 StreamWriter 是否在每次調用 StreamWriter..::.Write 之后,將其緩沖區刷新到基礎流。
BaseStream 獲取同后備存儲區連接的基礎流。
Encoding 獲取將輸出寫入到其中的 Encoding。 (重寫 TextWriter..::.Encoding。)
FormatProvider 獲取控制格式設置的對象。 (繼承自 TextWriter。)
NewLine 獲取或設置由當前 TextWriter 使用的行結束符字符串。 (繼承自 TextWriter。)
二、方法
Close 關閉當前的 StreamWriter 對象和基礎流。 (重寫 TextWriter..::.Close()()()。)
CreateObjRef 創建一個對象,該對象包含生成用於與遠程對象進行通信的代理所需的全部相關信息。 (繼承自 MarshalByRefObject。)
Dispose 已重載。
Finalize 已重載。
Flush 清理當前編寫器的所有緩沖區,並使所有緩沖數據寫入基礎流。 (重寫 TextWriter..::.Flush()()()。)
GetLifetimeService 檢索控制此實例的生存期策略的當前生存期服務對象。 (繼承自 MarshalByRefObject。)
InitializeLifetimeService 獲取控制此實例的生存期策略的生存期服務對象。 (繼承自 MarshalByRefObject。)
MemberwiseClone 已重載。
Write 已重載。 寫入流。
WriteLine 已重載。
StreamWriter類示例:
static void Main(string[] args) { StreamWriter sw = new StreamWriter(@"D:text.txt"); Console.WriteLine(sw.AutoFlush); //輸出 False是否每次調用sw后將緩沖區刷新到基礎流 Console.WriteLine(sw.BaseStream.GetType()); //輸出 FileStream 直接寫路徑的基流是FileStream Console.WriteLine(sw.Encoding); //System.Text.UTF8Encoding Console.WriteLine(sw.FormatProvider); //zh-CN Console.WriteLine(sw.NewLine.ToString()); //當前TextWriter使用的行結束符字符串 sw.WriteLine("123123123"); //一次寫入一行 sw.Flush(); //有緩沖區,要強制輸出緩沖區內的數據,才真正顯示 sw.WriteLine("123123123"); sw.Flush(); sw.Write("測試測試測試測試測試測試"); //其實就相當於調用了基流的Write方法 sw.Flush(); Console.ReadKey(); }
今天遇到一個非常有趣的需求,需求太長說不明。但是可以理解為,僅僅需要讀取文本的第一行。因為如果整個文本讀取出來再獲得第一行的話,比較占用內存。因為那個文本足足有幾M大。因此用到了StreamReader的ReadLine()方法。DEMO如下:
class Program { static void Main(string[] args) { using (FileStream fs = new FileStream(@"D:\sql.txt", FileMode.Open, FileAccess.Read)) { StreamReader sr = new StreamReader(fs); string line1 = sr.ReadLine(); Console.WriteLine(line1); //輸出 111111111111 } Console.ReadKey(); } }
其中 被讀取的文本內容如下:
111111111111 222222222222 333333333333 444444444444 555555555555