天天看點

C# StreamReader/StreamWriter與FileStream用法詳解

一、<1>StreamReader類共有10個構造函數

  • StreamReader (Stream)    //  為指定的流初始化 StreamReader 類的新執行個體。

[csharp]  view plain  copy

  1. FileStream fs = new FileStream(@"D:\Readme.txt",FileMode.Open);  
  2. StreamReader sr = new StreamReader(fs);  
  • StreamReader (String)     //  為指定的檔案名初始化 StreamReader 類的新執行個體。   

[csharp]  view plain  copy

  1. StreamReader sr = new StreamReader(@"D:\Readme.txt");  
  • StreamReader (Stream, Boolean)    //  用指定的位元組順序(BOM)标記檢測選項,為指定的流初始化 StreamReader 類的一個新執行個體。       

[csharp]  view plain  copy

  1. StreamReader sr = new StreamReader( (System.IO.Stream)File.OpenRead(@"D:\Readme.txt"),true);  
  • StreamReader (Stream, Encoding)  //  用指定的字元編碼為指定的流初始化 StreamReader 類的一個新執行個體。(StreamReader預設的編碼是Unicode,UTF-8是其子集)

[csharp]  view plain  copy

  1. FileStream fs = new FileStream(@"D:\Readme.txt" , FileMode.Open );  
  2. nbsp;StreamReader sr = new StreamReader(fs,Encoding.GetEncoding("GB2312"));  
  • StreamReader (String, Boolean)  // 為指定的檔案名初始化 StreamReader 類的新執行個體,帶有指定的位元組順序标記檢測選項。  
  • StreamReader (String, Encoding)    // 用指定的字元編碼,為指定的檔案名初始化 StreamReader 類的一個新執行個體。
  • StreamReader (Stream, Encoding, Boolean)   // 為指定的流初始化 StreamReader 類的新執行個體,帶有指定的字元編碼和位元組順序标記檢測選項。
  • StreamReader (String, Encoding, Boolean)    // 為指定的檔案名初始化 StreamReader 類的新執行個體,帶有指定的字元編碼和位元組順序标記檢測選項。
  • StreamReader (Stream, Encoding, Boolean, Int32)    //  為指定的流初始化 StreamReader 類的新執行個體,帶有指定的字元編碼、位元組順序标記檢測選項和緩沖區大小。

[csharp]  view plain  copy

  1. FileStream fs = new FileStream(@"D:\Readme.txt" , FileMode.Open);  
  2. StreamReader sr = new StreamReader(fs,Encoding.ASCII,true,512);  
  • StreamReader (String, Encoding, Boolean, Int32)  //為指定的檔案名初始化 StreamReader 類的新執行個體,帶有指定字元編碼、位元組順序标記檢測選項和緩沖區大小。     

[csharp]  view plain  copy

  1. StreamReader sr = new StreamReader(@"D:\Readme.txt",Encoding.ASCII,true,512);  

一、<2>StreamReader常用方法

  • Read ()    //  單字元讀入(檔案指針不移動)
  1. public override int Read ();      //讀取輸入流中的下一個字元并使該字元的位置提升一個字元,傳回的是字元的十進制值。

[csharp]  view plain  copy

  1. StreamReader sr = new StreamReader(@"D:\Readme.txt",Encoding.GetEncoding("GB2312"));  //通常需要轉碼為GB2312  
  2. int Ichar = 0;  
  3. while ((Ichar = sr.Read()) != -1)    // 不再有可用的字元,則為 -1  
  4. {  
  5.      MessageBox.Show(Convert.ToChar(Ichar).ToString());   //将int類型轉成ASCII字元  
  6. }  
  1. public override int Read (char[] buffer,int index,int count);   //從目前流中将最多的 count 個字元讀入到buffer數組中,從buffer數組從index位開始寫入,傳回值為讀取的字元總數。

[csharp]  view plain  copy

  1. char[] buffer = new char[512];  
  2. int readCount = sr.Read(buffer, 0, 512);  
  3. for (int i = 0; i < readCount; i++)  
  4. {  
  5.     MessageBox.Show(buffer[i].ToString());  
  6. }  
  • ReadLine()   // 行讀入
  • 方法原型:public override string ReadLine ()   // 輸入流中的下一行;如果到達了輸入流的末尾,則為空引用

[csharp]  view plain  copy

  1. string strLine = null;  
  2. while ((strLine = sr.ReadLine()) != null)  
  3. {  
  4.      MessageBox.Show(strLine);  
  5. }  
  • ReadToEnd()   //  從流的目前位置到末尾讀取流。 
  • 方法原型:public override string ReadToEnd ();  //  如果目前位置位于流的末尾,則傳回空字元串 ("")。

    備注:用該方法可以把資料流一次性全部加載到記憶體中,記憶體中資料的操作的速度是非常快的,但要注意的是,如果檔案太大的話,可能記憶體會不夠,就用Read或ReadLine()方法讀取。

[csharp]  view plain  copy

  1. string strLine = sr.ReadToEnd();  
  2.  MessageBox.Show(strLine);  
  • Peek ()  //讀取下 一個字元,但位置不移動
  • 方法原型:public override int Peek ()

[csharp]  view plain  copy

  1. while (sr.Peek() != -1)  
  2. {  
  3.    MessageBox.Show(sr.ReadLine());  
  4. }  

一、<3>StreamReader常用屬性:

  • EndOfStream  // 擷取一個值,該值表示目前的流位置是否在流的末尾。            

[csharp]  view plain  copy

  1. while (!sr.EndOfStream)  
  2. {  
  3.      MessageBox.Show(sr.ReadLine());  
  4. }  
  • CurrentEncoding   // 擷取目前 StreamReader 對象正在使用的目前字元編碼

[csharp]  view plain  copy

  1. MessageBox.Show(sr.CurrentEncoding.EncodingName);  
  • BaseStream  // 傳回基礎流。 

二、<1>StreamWriter類共有7個構造函數:

  • StreamWriter (Stream)   // 用 UTF-8 編碼及預設緩沖區大小,為指定的流初始化 StreamWriter 類的一個新執行個體。

[csharp]  view plain  copy

  1. FileStream fs = new FileStream(@"D:\a.txt",FileMode.CreateNew);  
  2. StreamWriter sw = new StreamWriter(fs);  
  • StreamWriter (String)   // 使用預設編碼和緩沖區大小,為指定路徑上的指定檔案初始化StreamWriter 類的新執行個體。    

[csharp]  view plain  copy

  1. StreamWriter sw = new StreamWriter(@"D:\a.txt");  
  • StreamWriter (Stream, Encoding)   // 用指定的編碼及預設緩沖區大小,為指定的流初始化 StreamWriter 類的新執行個體。(預設寫入編碼為UTF8)

[csharp]  view plain  copy

  1. FileStream fs = new FileStream(@"D:\a.txt",FileMode.CreateNew);  
  2. StreamWriter sw = new StreamWriter(fs,Encoding.UTF8);  
  • StreamWriter (String, Boolean)  // 使用預設編碼和緩沖區大小,為指定路徑上的指定檔案初始化 StreamWriter 類的新執行個體。true表示如果該檔案存在,則可以向其追加。false表示将其全部重寫。如果該檔案不存在,則此構造函數将建立一個新檔案。

[csharp]  view plain  copy

  1. StreamWriter sw = new StreamWriter(@"D:\a.txt", true);  
  • StreamWriter (Stream, Encoding, Int32)  //  用指定的編碼及緩沖區大小,為指定的流初始化 StreamWriter 類的新執行個體。int為緩沖區大小

[csharp]  view plain  copy

  1. StreamWriter sw = new StreamWriter(fs, Encoding.UTF8,512);  
  • StreamWriter (String, Boolean, Encoding)    //  使用指定編碼和預設緩沖區大小,為指定路徑上的指定檔案初始化 StreamWriter 類的新執行個體。true表示如果該檔案存在,則可以向其追加。false表示将其全部重寫。如果該檔案不存在,則此構造函數将建立一個新檔案。

[csharp]  view plain  copy

  1. StreamWriter sw = new StreamWriter(@"D:\a.txt",true, Encoding.UTF8);  
  • StreamWriter (String, Boolean, Encoding, Int32)  // 使用指定編碼和緩沖區大小,為指定路徑上的指定檔案初始化 StreamWriter 類的新執行個體。true表示如果該檔案存在,則可以向其追加。false表示将其全部重寫。如果該檔案不存在,則此構造函數将建立一個新檔案。

[csharp]  view plain  copy

  1. StreamWriter sw = new StreamWriter(@"D:\a.txt",true, Encoding.UTF8, 512);  

二、<2>StreamWriter類常用方法:

  • Write()  //  寫入流。(該方法有17種重載方法,就不一一解說,講幾個常用的方法)

        1、public override void Write(string value)    //将字元串寫入流。 

[csharp]  view plain  copy

  1. StreamWriter sw = new StreamWriter(@"D:\a.txt",true);  //true表示如果a.txt檔案已存在,則以追加的方式寫入  
  2. sw.Write(this.textBox1.Text);    
  3. sw.Close();  

        2、 public override void Write(char value)  //  按字元寫入

[csharp]  view plain  copy

  1. char[] charArray = new char[] { 'a', 'b', 'c', 'd', 'e', 'f' };  
  2. for (int i = 0; i < charArray.Length; i++)  
  3. {  
  4.      sw.Write(charArray[i]);  
  5. }  

         3、 public override void Write (char[] buffer)   // 按字元數組寫入

[csharp]  view plain  copy

  1. char[] charArray = new char[] { 'a', 'b', 'c', 'd', 'e', 'g' };  
  2. sw.Write(charArray);  

          4、public virtual void Write (string format,params Object[] arg)    //按指定格式轉換的字元串寫入  

[csharp]  view plain  copy

  1. sw.Write("我的期待月薪為{0,9:C4},實作年齡為{1,9},成功率{2,9:P2}", new Object[]{ 20000, 30, 1 });  

                運作結果:我的期待月薪為¥20,000.0000,實作年齡為       30,成功率  100.00% ,具體請參考stringFormat文法

          5 、public override void Write (char[] buffer,int index,int count)   // 從buffer數組的第index開始寫入count個字元

[csharp]  view plain  copy

  1. char[] charArray = new char[] { 'a', 'b', 'c', 'd', 'e', 'f' ,'g'};  
  2. sw.Write(charArray , 3, 4);  

                  運作結果:defg

  • WriteLine()     //  寫入流,後跟行結束符(行結束符樣式可用NewLine屬性設定)。(該方法有18種重載方法,隻講常用的)

         1、public virtual void WriteLine ()   //寫入空行,等同于跳到下一行              

[csharp]  view plain  copy

  1. sw.WriteLine();  

         2、 public virtual void WriteLine (char value)

         3、public virtual void WriteLine (char[] buffer)

         4、public virtual void WriteLine (string value)

         5、public virtual void WriteLine (string format,params Object[] arg)

         6、public virtual void WriteLine (char[] buffer,int index,int count)

         7、public virtual void WriteLine (Object value)    //

  • Flush    // 清理目前編寫器的所有緩沖區,并使所有緩沖資料寫入基礎流。  
  • 方法原型:public override void Flush ()

二、<3>StreamWriter常用屬性:

  • AutoFlush  // 設定StreamWriter 是否在每次調用 StreamWriter.Write 之後,将其緩沖區重新整理到基礎流。

            備注:除非我們顯示地調用Flush 或 Close,否則,重新整理流不會重新整理其基礎編碼器,也就是不會寫入到硬碟中,将 AutoFlush 設定為 true後隻要調用write()方法會自動将資料寫入到硬碟中,如果使用者期望您所寫入的裝置能夠立即回報,則将 AutoFlush 設定為 true。

  • Encoding   // 擷取将輸出寫入到其中的 Encoding。

[csharp]  view plain  copy

  1. MessageBox.Show(sw.Encoding.EncodingName);  
  • NewLine   //  設定由目前 TextWriter 使用的行結束符字元串樣式。

[csharp]  view plain  copy

  1. sw.NewLine = "\t";  
  2. sw.WriteLine("aaa");  
  3. sw.WriteLine("bbb");  

            運作結果:“aaa    bbb    ”

  • BaseStream   //擷取同後備存儲區連接配接的基礎流。

  三、<1>FileStream共有15個構造函數

  • FileStream (String, FileMode)   // 使用指定的路徑和建立模式初始化 FileStream 類的新執行個體。

    函數原型:public FileStream (string path,FileMode mode)

    FileMode成員:

    • (1)Append   打開現有檔案并查找到檔案尾,或建立新檔案。FileMode.Append 隻能同 FileAccess.Write 一起使用。
    • (2)Create     建立新檔案(如果檔案不存在)。如果檔案已存在,它将被改寫。這要求 FileIOPermissionAccess.Write。FileMode.Create 等效于這樣的 請求:如果檔案不存在,則使用 CreateNew;否則使用 Truncate。
    • (3)CreateNew  建立新檔案。此操作需要 FileIOPermissionAccess.Write 。如果檔案已存在,則将引發 IOException。                        
    • (4)Open  打開現有檔案。打開檔案的能力取決于 FileAccess 所指定的值。如果該檔案不存在,則引發 System.IO.FileNotFoundException。
    • (5)OpenOrCreate   打開檔案(如果檔案存在);否則,建立新檔案。如果用 FileAccess.Read 打開檔案,則需FileIOPermissionAccess.Read。
    • (6)Truncate 打開現有檔案。檔案一旦打開,就将被截斷為零位元組大小。此操作需要 FileIOPermissionAccess.Write。試圖從使用 Truncate 打開的檔案中進行讀取将導緻異常。 

[csharp]  view plain  copy

  1. FileStream fs = new FileStream(@"D:\a.txt",FileMode.Create);  
  • FileStream (String, FileMode, FileAccess)   // 使用指定的路徑、建立模式和讀/寫權限初始化 FileStream 類的新執行個體。

    函數原型:public FileStream (string path,FileMode mode,FileAccess access)          

    FileAccess成員:

    • (1)Read        對檔案的讀通路。可從檔案中讀取資料。同 Write 組合即構成讀寫通路權。    
    • (2)ReadWrite 對檔案的讀通路和寫通路。可從檔案讀取資料和将資料寫入檔案。 
    • (3)Write         檔案的寫通路。可将資料寫入檔案。同 Read 組合即構成讀/寫通路權。                     

[csharp]  view plain  copy

  1. FileStream fs = new FileStream(@"D:\a.txt",FileMode.Create,FileAccess.ReadWrite);  
  • FileStream (String, FileMode, FileAccess, FileShare)   // 使用指定的路徑、建立模式、讀/寫權限和共享權限建立 FileStream 類的新執行個體。

    函數原型:public FileStream (string path,FileMode mode,FileAccess access,FileShare share)

    FileShare成員:

    • (1)Delete         允許随後删除檔案(在一個程序進行讀取某檔案時,另一個程序可以同時對該檔案進行删除)。
    • (2)Inheritable 使檔案句柄可由子程序繼承。Win32 不直接支援此功能。
    • (3)None           謝絕共享目前檔案。檔案關閉前,打開該檔案的任何請求(由此程序或另一程序發出的請求)都将失敗。  
    • (4)Read           允許随後打開檔案讀取。如果未指定此标志,則檔案關閉前,任何打開該檔案以進行讀取的請求(由此程序或另一程序發出的請求)都将失敗。但 是,即使指定了此标志,仍可能需要附權重限才能夠通路該檔案。  
    • (5)ReadWrite 允許随後打開檔案讀取或寫入。如果未指定此标志,則檔案關閉前,任何打開該檔案以進行讀取或寫入的請求(由此程序或另一程序發出)都将失敗。但是,即使指定了此标志,仍可能需要附權重限才能夠通路該檔案。  
    • (6)Write            允許随後打開檔案寫入。如果未指定此标志,則檔案關閉前,任何打開該檔案以進行寫入的請求(由此程序或另一進過程發出的請求)都将失敗。但是,即使指定了此标志,仍可能需要附權重限才能夠通路該檔案。 

[csharp]  view plain  copy

  1. FileStream fs = new FileStream(@"D:\a.txt",FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite);  
  • FileStream (String, FileMode, FileAccess, FileShare, Int32)  用指定的路徑、建立模式、讀/寫及共享權限和緩沖區大小初始化 FileStream 類的新執行個體。

    函數原型:public FileStream (string path,FileMode mode,FileAccess access,FileShare share,int bufferSize)

[csharp]  view plain  copy

  1. FileStream fs = new FileStream(@"D:\a.txt",FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite,512);  
  • FileStream (String, FileMode, FileAccess, FileShare, Int32, Boolean)  // 使用指定的路徑、建立模式、讀/寫和共享權限、緩沖區大小和同步或異步狀态初始化FileStream 類的新執行個體。 

    函數原型:public FileStream (string path,FileMode mode,FileAccess access,FileShare share,int bufferSize,bool useAsync) // userAsyn 指定使用異步 I/O 還是同步 I/O。

    備注:當異步打開時,BeginRead 和 BeginWrite 方法在執行大量讀或寫時效果更好,但對于少量的讀/寫,這些方法速度可能要慢得多。正确使用異步 I/O,可以使應用程式的速度加快 10 倍,但是如果在沒有為異步 I/O 重新設計應用程式的情況下使用異步 I/O,則可能使性能降低 10 倍。

[csharp]  view plain  copy

  1. FileStream fs = new FileStream(@"D:\a.txt",FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite,512 ,true);  
  • FileStream (String, FileMode, FileAccess, FileShare, Int32, FileOptions)  // 使用指定的路徑、建立模式、讀/寫和共享權限、其它 FileStreams 可以具有的對此檔案的通路權限、緩沖區大小和附加檔案選項初始化 FileStream 類的新執行個體。

    函數原型:public FileStream (string path,FileMode mode,FileAccess access,FileShare share,int bufferSize,FileOptions options)

    FileOptions 成員:

    • (1)Asynchronous   訓示檔案可用于異步讀取和寫入。   
    • (2)DeleteOnClose 訓示當不再使用某個檔案時,自動删除該檔案。 
    • (3)Encrypted           訓示檔案是加密的,隻能通過用于加密的同一使用者帳戶來解密。  
    • (4)None                   訓示無其他參數。  
    • (5)RandomAccess 訓示随機通路檔案。系統可将此選項用作優化檔案緩存的提示。  
    • (6)SequentialScan 訓示按從頭到尾的順序通路檔案。系統可将此選項用作優化檔案緩存的提示。如果應用程式移動用于随機通路的檔案指針,可能不發生優化緩存,但仍然保證操作的正确性。 指定此标志可以提高使用順序通路讀取大檔案的應用程式的性能。對于大多數情況下都按順序讀取大檔案、但偶爾跳過小的位元組範圍的應用程式而言,性能提升可能更明顯。
    • (7)WriteThrough   訓示系統應通過任何中間緩存、直接寫入磁盤。 

[csharp]  view plain  copy

  1. FileStream fs = new FileStream(@"D:\a.txt",FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite,512 ,FileOptions.Asynchronous);  
  • FileStream (String, FileMode, FileSystemRights, FileShare, Int32, FileOptions)  使用指定的路徑、建立模式、通路權限和共享權限、緩沖區大小和附加檔案選項初始化 FileStream 類的新執行個體。

    函數原型:public FileStream (string path,FileMode mode,FileSystemRights rights,FileShare share,int bufferSize,FileOptions options)

    FileSystemRights成員:(通路權限)

    • AppendData  指定将資料追加到檔案末尾的權限。  
    • ChangePermissions 指定更改與檔案或檔案夾關聯的安全和稽核規則的權限。  
    •  CreateDirectories 指定建立檔案夾的權限。此權限需要 Synchronize 值。請注意,如果在建立檔案或檔案夾時未顯式設定 Synchronize 值,則會自動為您設定 Synchronize 值。
    • CreateFiles 指定建立檔案的權限。此權限需要 Synchronize 值。請注意,如果在建立檔案或檔案夾時未顯式設定Synchronize 值,則會自動為您設定 Synchronize 值。
    •  Delete 指定删除檔案夾或檔案的權限。   
    • DeleteSubdirectoriesAndFiles 指定删除檔案夾和該檔案夾中包含的所有檔案的權限。  
    • ExecuteFile 指定運作應用程式檔案的權限。  
    •  FullControl 指定對檔案夾或檔案進行完全控制以及修改通路控制和稽核規則的權限。此值表示對檔案進行任何操作的權限,并且是此枚舉中的所有權限的組合。 
    • ListDirectory 指定讀取目錄内容的權限。  
    • Modify 指定讀、寫、列出檔案夾内容、删除檔案夾和檔案以及運作應用程式檔案的權限。此權限包括 ReadAndExecute 權限、Write 權限和 Delete 權限。
    •  Read 指定以隻讀方式打開和複制檔案夾或檔案的權限。此權限包括 ReadData 權限、
    • ReadExtendedAttributes 權限、ReadAttributes 權限和 ReadPermissions 權限。  
    •  ReadAndExecute 指定以隻讀方式打開和複制檔案夾或檔案以及運作應用程式檔案的權限。此權限包括 Read 權限和 ExecuteFile 權限。 
    • ReadAttributes 指定從檔案夾或檔案打開和複制檔案系統屬性的權限。例如,此值指定檢視檔案建立日期或修改日期的權限。這不包括讀取資料、擴充檔案系統屬性或通路和稽核規則的權限。 
    • ReadData 指定打開和複制檔案或檔案夾的權限。這不包括讀取檔案系統屬性、擴充檔案系統屬性或通路和稽核規則的權限。  
    • ReadExtendedAttributes 指定從檔案夾或檔案打開和複制擴充檔案系統屬性的權限。例如,此值指定檢視作者和内容資訊的權限。這不包括讀取資料、檔案系統屬性或通路和稽核規則的權限。 
    • ReadPermissions 指定從檔案夾或檔案打開和複制通路和稽核規則的權限。這不包括讀取資料、檔案系統屬性或擴充檔案系統屬性的權限。   
    • Synchronize 指定應用程式是否能夠等待檔案句柄,以便與 I/O 操作的完成保持同步。
    • Synchronize 值在允許通路時自動被設定,而在拒絕通路時自動被排除。建立檔案或檔案夾的權限需要此值。請注意,如果在建立檔案時未顯式設定此值,則會自動為您設定此值。
    • TakeOwnership 指定更改檔案夾或檔案的所有者的權限。請注意:資源的所有者對該資源擁有完全權限。  
    • Traverse 指定列出檔案夾的内容以及運作該檔案夾中所包含的應用程式的權限。  
    • Write 指定建立檔案夾和檔案以及向檔案添加資料或從檔案移除資料的權限。此權限包括 
    • WriteData 權限、AppendData 權限、WriteExtendedAttributes 權限和 WriteAttributes 權限。   
    • WriteAttributes 指定打開檔案系統屬性以及将檔案系統屬性寫入檔案夾或檔案的權限。這不包括寫入資料、擴充屬性以及寫入通路和稽核規則的功能。
    • WriteData 指定打開和寫入檔案或檔案夾的權限。這不包括打開和寫入檔案系統屬性、擴充檔案系統屬性或通路和稽核規則的權限。  
    •  WriteExtendedAttributes 指定打開檔案夾或檔案的擴充檔案系統屬性以及将擴充檔案系統屬性寫入檔案夾或檔案的權限。這不包括寫入資料、屬性或通路和稽核規則的功能。  
  • FileStream (String, FileMode, FileSystemRights, FileShare, Int32, FileOptions, FileSecurity)  使用指定的路徑、建立模式、通路權限和共享權限、緩沖區大小、附加檔案選項、通路控制和稽核安全初始化 FileStream 類的新執行個體。

    函數原型:public FileStream (string path,FileMode mode,FileSystemRights rights,FileShare share,int bufferSize,FileOptions options,FileSecurity fileSecurity)

三、<2>FileStream常用的方法:

  •  Read()   //從流中讀取位元組塊并将該資料寫入給定緩沖區中。

    函數原型:public override int Read (byte[] array,int offset,int count)     // 從byte數組的offset位開始寫入count個位元組

    備注:因為FileStream主要用于讀取位元組和位元組數組,也就是二進制資料,是以它不能指定編碼格式,但是如果我們用它來讀取有中文的文本的話,我們就會發現它會亂碼,因為預設的編碼是UTF8,是以我們必須用System.Text.Encoding.GetEncoding("GB2312").GetChars()進行轉碼,這樣很麻煩,是以我們通常不用FileStream讀寫有中文的文本。

[csharp]  view plain  copy

  1. byte[] byteArray = new byte[512];  
  2. char[] charArray = new char[512];  
  3. int byteCount = fs.Read(byteArray, 0, 512);  
  4. System.Text.Encoding.GetEncoding("GB2312").GetChars(byteArray,0,byteCount,charArray,0);  
  5. for (int i = 0; i < byteCount; i++)  
  6. {  
  7.     MessageBox.Show(charArray[i].ToString());    
  8. }  
  • ReadByte()    // 從檔案中讀取一個位元組,并将讀取位置提升一個位元組。(沒法讀取中文)

    函數原型:public override int ReadByte ()     //傳回的字元的ASCII的十進制數,流的末尾讀取則為 -1

[csharp]  view plain  copy

  1. int b = 0;  
  2. while((b = fs.ReadByte())!=-1)  
  3. {  
  4.     MessageBox.Show(Convert.ToChar(b).ToString());    
  5. }  
  • Seek()   // 将該流的目前位置設定為給定值。 

    函數原型:public override long Seek (long offset,SeekOrigin origin)   //相對于origin 的點,從此偏移offset個位元組處開始查找。(按位元組偏移的,而不是字元)

    SeekOrigin成員:

    • (1)Begin      指定流的開頭。  
    • (2)Current   指定流内的目前位置。  
    • (3)End         指定流的結尾。  

[csharp]  view plain  copy

  1. int b = 0;  
  2. fs.Seek(2, SeekOrigin.Begin);  //檔案指針偏移到第2個位元組  
  3. b = fs.ReadByte();  
  4. MessageBox.Show(Convert.ToChar(b).ToString());  
  5. fs.Seek(-3, SeekOrigin.End);   //檔案指針從檔案末尾往回偏移3個位元組  
  6. b = fs.ReadByte();  
  7. MessageBox.Show(Convert.ToChar(b).ToString());  

             假設檔案的内容是:abcdefghijk        那結果就是:c 和 j

  • Write()   //使用從緩沖區讀取的資料将位元組塊寫入該流。  

    函數原型:public override void Write (byte[] array,int offset,int count) // 将位元組數組從offset位開始寫入count個位元組

[csharp]  view plain  copy

  1. byte[] byteArray = new byte[] { 97,98,99,100,110,120};  //位元組數組  
  2. fs.Write(byteArray, 0, byteArray.Length);  

            運作結果:abcdnx

  • WriteByte()   //将一個位元組寫入檔案流的目前位置。 

    函數原型:public override void WriteByte (byte value)

[csharp]  view plain  copy

  1. byte b = 97;  
  2. fs.WriteByte(b);  
  • BeginRead()   // 開始異步讀。 (需要設定FileOptions.Asynchronous參數才能進行異步操作)

    函數原型:public override IAsyncResult BeginRead (byte[] array,int offset,int numBytes,AsyncCallback userCallback,Object stateObject)

    參數:numBytes  表示最多讀取的位元組數。 

                userCallback   異步讀操作完成後調用的方法。 

                stateObject    一個使用者提供的對象,它将該特定的異步讀取請求與其他請求差別開來。

    備注:調用BeginRead/BeginWrite/EndRead/EndWrite執行異步時需要在建立FileStream時傳入FileOptions.Asynchronous參數才能擷取真正的IOCP支援,否則BeginXXX方法将會使用預設定義在Stream基類上的實作。Stream基類中BeginXXX方法會使用委托的BeginInvoke方法來發起異步調用——這會使用一個額外的線程來執行任務。雖然目前調用線程立即傳回了,但是資料的讀取或寫入操作依舊占用着另一個線程(IOCP支援的異步操作時不需要線程的),是以并沒有任何“節省”,反而還很有可能降低了應用程式的性能,因為額外的線程切換會造成性能損失。

  • EndRead()    //  等待挂起的異步讀取完成。(需要設定FileOptions.Asynchronous參數才能進行異步操作)

    函數原型:public override int EndRead (IAsyncResult asyncResult) 

    參數:asyncResult  對所等待的挂起異步請求的引用。
  • BeginWrite()   //  開始異步寫。(需要設定FileOptions.Asynchronous參數才能進行異步操作)

    函數原型:public override IAsyncResult BeginWrite (byte[] array,int offset,int numBytes,AsyncCallback userCallback,Object stateObject)

  • EndWrite()    // 結束異步寫入,在 I/O 操作完成之前一直阻止。(需要設定FileOptions.Asynchronous參數才能進行異步操作)  

    函數原型:public override void EndWrite (IAsyncResult asyncResult)

  • Flush()     //  清除該流的所有緩沖區,使得所有緩沖的資料都被寫入到基礎裝置。  

    函數原型:public override void Flush ()

三、<3>FileStream常用的屬性:

  • Name    // 擷取操作的檔案完整位址。 
  • Length   //  擷取整個檔案用位元組表示的流長度。 (一個中文占2個位元組)
  • Position   // 擷取或設定此流的目前位置。
  • CanRead   // 擷取目前流是否支援讀取。(如果該流已關閉或是通過隻寫通路方式打開的,則傳回false,調用 Read、ReadByte 和 BeginRead 方法将引發 NotSupportedException。)
  • CanSeek  // 擷取目前流是否支援查找。(如果該流已關閉或是通過隻寫通路方式打開的,則傳回false,調用 Length、SetLength、Position 和 Seek 方法将引發 NotSupportedException。)
  • CanWrite   // 擷取目前流是否支援寫入。(如果該流已關閉或是通過隻寫通路方式打開的,則傳回false,調用 SetLength、Write、BeginWrite 或 WriteByte 方法将引發 NotSupportedException。)
  • IsAsync  // 擷取FileStream 是否異步打開的。 
  • Handle  //  擷取目前 FileStream 對象所封裝檔案的作業系統檔案句柄。
  • SafeFileHandle  // 擷取 SafeFileHandle 對象,該對象表示目前 FileStream 對象封裝的檔案的作業系統檔案句柄。 

四、StreamReader/StreamWriter與FileStream的差別

  • 一個很大的差別就是:StreamReader/StreamWriter操作的是字元資料(char),而FileStream操作的是位元組資料(byte),FileStream與StreamXXXX類的預設編碼都是UTF8,而一個中文字元占2個字元,是以StreamXXXX類常用于文本的打開與儲存,而FileStream則用于資料的傳輸。
  • FileStream是不能指定編碼(因為它看到的隻是檔案的二進制形式,當然無所謂編碼),是以如果有中文的文本的話需要轉碼。
  • FileStream是一個較底層的類,隻能簡單地讀檔案到而緩沖區,而StreamXXXX類封裝了一些進階的方法,如ReadLine() (按行讀取)
  • FileStream可以指定FileMode、FileAccess、FileShare、FileOptions等各種檔案通路控制權限、共享權限等,大大擴充了檔案讀寫的靈活性,而且FileStream還提供了BeginRead/BeginWrite(異步讀寫)的操作方法,用得好的話可以提高10倍操作速度哦!