1. 程式人生 > 其它 >【C#IO流】位元組流|字元流

【C#IO流】位元組流|字元流

.net中對於IO流的支援分為兩個層次:基於位元組和基於字元兩種方式。

字元流:實現System.IO.TextReader和TextWaiter抽象類是所有基於字元流的父類,以特定編碼從位元組流中讀取字元。

位元組流:基於位元組的方式適用於操作二進位制檔案,比如exe檔案、視訊、音訊檔案等等。
Stream抽象類是所有基於位元組方式的流的父類。

字元流中TextReader和TextWaiter是抽象類是stream的讀取器,以下我就以StreamReader和StreamWaiter為例子, 介紹他們的使用方法。其他類也是繼承自extReader和TextWaiter是抽象類,用法都類似。

StreamWaiter類和StreamReader類的用法

事實上, StreamReader為了效能的考慮, 在自己的內部內建並維護了一個byte buffer。 如果在宣告StreamReader物件的時候沒有指定這個buffer的尺寸, 那麼它的預設大小是1k。 如果是檔案流, 那麼這個buffer的預設大小是4K。 所有Read操作,都直接或間接轉換為了對這個buffer的操作。

StreamReader類的用法

 //using (StreamReader sr = new StreamReader(pat,Encoding.Unicode))//更具檔案內容選擇合適的編碼格式讀取檔案。不指定就採用本機編碼
using (StreamReader sr = new StreamReader(pat)) { //屬性 Stream stream = sr.BaseStream; //返回基流,stream 是位元組碼。 Console.WriteLine(stream.GetType()); //輸出 System.IO.FileStream Console.WriteLine(sr.CurrentEncoding); //當前流讀取器使用的編碼,預設是本機編碼(當構造器不指定時),如果構造方法指定了,輸出的就是構造方法指定的編碼
//方法 //Read()應用 char[] burffer1 = new char[9];// {'a', 's', 'd', 'f', 'g', 'h', 'j', 'k' }; char[] burffer2 = new char[9]; var s = sr.Read();//讀取當前指標的所指向的字元 ,讀取完成後指標向前移一個字元。 Console.WriteLine(Convert.ToChar(s)); //A //Read(Span<Char>) Span<char> span = new Span<char>(burffer1);//將陣列轉成指標陣列 sr.Read(span);//將流中存入 span,存滿後就停止。charPos又向前移動了9個位置 Console.WriteLine(string.Join("",span.ToArray()));//SCII hell //Read(Char[], Int32, Int32) sr.Read(burffer2, 2, 4);//從sr 重charPos 指標當前所指向的位子開始讀取 4個字元,存入burffer陣列的3-7位置。charPos++向前移動了4個位置 Console.WriteLine(String.Join("", burffer2));//連結字元陣列並且列印 o I //重置,把快取區的資料清空,並且從新設定流指標和字元指標。 Console.WriteLine(sr.BaseStream.Position); sr.DiscardBufferedData(); sr.BaseStream.Seek(0, SeekOrigin.Begin); //0表示相對於SeekOrigin.Begin的位置。SeekOrigin.Begin表示在哪裡讀取流 //判斷是否讀取完成。讀取完成返回值是-1,Peek()也read()也都是返回accii的編碼 while (sr.Peek() > -1) { //ReadLine() 的應用 var ren = sr.ReadLine();//ASCII hello I am programmer hello 因為快取和指標都重置過了。從頭開始讀取 Console.WriteLine(sr.Peek()); Console.WriteLine(ren);//am programmer } sr.DiscardBufferedData(); sr.BaseStream.Seek(0, SeekOrigin.Begin); //0表示相對於SeekOrigin.Begin的位置。SeekOrigin.Begin表示在哪裡讀取流 Console.WriteLine(sr.ReadToEnd());//從 charPos++ 所指向的字元開始讀取 一直讀取到內容結束。因為指標已經知道末尾,所以返回為空 Console.WriteLine(sr.ReadToEnd()); }

程式設計是個人愛好