StreamReader和StreamWrite和FileStream區別和用法
一、<1>StreamReader類共有10個建構函式
- StreamReader (Stream) // 為指定的流初始化 StreamReader 類的新例項。
- FileStream fs = new FileStream(@"D:\Readme.txt",FileMode.Open);
- StreamReader sr = new StreamReader(fs);
- StreamReader (String) // 為指定的檔名初始化 StreamReader 類的新例項。
- StreamReader sr = new
- StreamReader (Stream, Boolean) // 用指定的位元組順序(BOM)標記檢測選項,為指定的流初始化 StreamReader 類的一個新例項。
- StreamReader sr = new StreamReader( (System.IO.Stream)File.OpenRead(@"D:\Readme.txt"),true);
- StreamReader (Stream, Encoding) // 用指定的字元編碼為指定的流初始化 StreamReader 類的一個新例項。(StreamReader預設的編碼是Unicode,UTF-8是其子集)
- FileStream fs = new FileStream(@"D:\Readme.txt" , FileMode.Open );
- 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 類的新例項,帶有指定的字元編碼、位元組順序標記檢測選項和緩衝區大小。
- FileStream fs = new FileStream(@"D:\Readme.txt" , FileMode.Open);
- StreamReader sr = new StreamReader(fs,Encoding.ASCII,true,512);
- StreamReader (String, Encoding, Boolean, Int32) //為指定的檔名初始化 StreamReader 類的新例項,帶有指定字元編碼、位元組順序標記檢測選項和緩衝區大小。
- StreamReader sr = new StreamReader(@"D:\Readme.txt",Encoding.ASCII,true,512);
一、<2>StreamReader常用方法
- Read () // 單字元讀入(檔案指標不移動)
- public override int Read (); //讀取輸入流中的下一個字元並使該字元的位置提升一個字元,返回的是字元的十進位制值。
- StreamReader sr = new StreamReader(@"D:\Readme.txt",Encoding.GetEncoding("GB2312")); //通常需要轉碼為GB2312
- int Ichar = 0;
- while ((Ichar = sr.Read()) != -1) // 不再有可用的字元,則為 -1
- {
- MessageBox.Show(Convert.ToChar(Ichar).ToString()); //將int型別轉成ASCII字元
- }
- public override int Read (char[] buffer,int index,int count); //從當前流中將最多的 count 個字元讀入到buffer陣列中,從buffer陣列從index位開始寫入,返回值為讀取的字元總數。
- char[] buffer = new char[512];
- int readCount = sr.Read(buffer, 0, 512);
- for (int i = 0; i < readCount; i++)
- {
- MessageBox.Show(buffer[i].ToString());
- }
- ReadLine() // 行讀入
- 方法原型:public override string ReadLine () // 輸入流中的下一行;如果到達了輸入流的末尾,則為空引用
- string strLine = null;
- while ((strLine = sr.ReadLine()) != null)
- {
- MessageBox.Show(strLine);
- }
- ReadToEnd() // 從流的當前位置到末尾讀取流。
- 方法原型:public override string ReadToEnd (); // 如果當前位置位於流的末尾,則返回空字串 ("")。
備註:用該方法可以把資料流一次性全部載入到記憶體中,記憶體中資料的操作的速度是非常快的,但要注意的是,如果檔案太大的話,可能記憶體會不夠,就用Read或ReadLine()方法讀取。
- string strLine = sr.ReadToEnd();
- MessageBox.Show(strLine);
- Peek () //讀取下 一個字元,但位置不移動
- 方法原型:public override int Peek ()
- while (sr.Peek() != -1)
- {
- MessageBox.Show(sr.ReadLine());
- }
一、<3>StreamReader常用屬性:
- EndOfStream // 獲取一個值,該值表示當前的流位置是否在流的末尾。
- while (!sr.EndOfStream)
- {
- MessageBox.Show(sr.ReadLine());
- }
- CurrentEncoding // 獲取當前 StreamReader 物件正在使用的當前字元編碼
- MessageBox.Show(sr.CurrentEncoding.EncodingName);
- BaseStream // 返回基礎流。
二、<1>StreamWriter類共有7個建構函式:
- StreamWriter (Stream) // 用 UTF-8 編碼及預設緩衝區大小,為指定的流初始化 StreamWriter 類的一個新例項。
- FileStream fs = new FileStream(@"D:\a.txt",FileMode.CreateNew);
- StreamWriter sw = new StreamWriter(fs);
- StreamWriter (String) // 使用預設編碼和緩衝區大小,為指定路徑上的指定檔案初始化StreamWriter 類的新例項。
- StreamWriter sw = new StreamWriter(@"D:\a.txt");
- StreamWriter (Stream, Encoding) // 用指定的編碼及預設緩衝區大小,為指定的流初始化 StreamWriter 類的新例項。(預設寫入編碼為UTF8)
- FileStream fs = new FileStream(@"D:\a.txt",FileMode.CreateNew);
- StreamWriter sw = new StreamWriter(fs,Encoding.UTF8);
- StreamWriter (String, Boolean) // 使用預設編碼和緩衝區大小,為指定路徑上的指定檔案初始化 StreamWriter 類的新例項。true表示如果該檔案存在,則可以向其追加。false表示將其全部重寫。如果該檔案不存在,則此建構函式將建立一個新檔案。
- StreamWriter sw = new StreamWriter(@"D:\a.txt", true);
- StreamWriter (Stream, Encoding, Int32) // 用指定的編碼及緩衝區大小,為指定的流初始化 StreamWriter 類的新例項。int為緩衝區大小
- StreamWriter sw = new StreamWriter(fs, Encoding.UTF8,512);
- StreamWriter (String, Boolean, Encoding) // 使用指定編碼和預設緩衝區大小,為指定路徑上的指定檔案初始化 StreamWriter 類的新例項。true表示如果該檔案存在,則可以向其追加。false表示將其全部重寫。如果該檔案不存在,則此建構函式將建立一個新檔案。
- StreamWriter sw = new StreamWriter(@"D:\a.txt",true, Encoding.UTF8);
- StreamWriter (String, Boolean, Encoding, Int32) // 使用指定編碼和緩衝區大小,為指定路徑上的指定檔案初始化 StreamWriter 類的新例項。true表示如果該檔案存在,則可以向其追加。false表示將其全部重寫。如果該檔案不存在,則此建構函式將建立一個新檔案。
- StreamWriter sw = new StreamWriter(@"D:\a.txt",true, Encoding.UTF8, 512);
二、<2>StreamWriter類常用方法:
- Write() // 寫入流。(該方法有17種過載方法,就不一一解說,講幾個常用的方法)
1、public override void Write(string value) //將字串寫入流。
[csharp] view plaincopy- StreamWriter sw = new StreamWriter(@"D:\a.txt",true); //true表示如果a.txt檔案已存在,則以追加的方式寫入
- sw.Write(this.textBox1.Text);
- sw.Close();
2、public override void Write(char value) // 按字元寫入
[csharp] view plaincopy- char[] charArray = new char[] { 'a', 'b', 'c', 'd', 'e', 'f' };
- for (int i = 0; i < charArray.Length; i++)
- {
- sw.Write(charArray[i]);
- }
3、public override void Write (char[] buffer) // 按字元陣列寫入
[csharp] view plaincopy- char[] charArray = new char[] { 'a', 'b', 'c', 'd', 'e', 'g' };
- sw.Write(charArray);
4、public virtual void Write (string format,params Object[] arg) //按指定格式轉換的字串寫入
[csharp] view plaincopy- 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 plaincopy- char[] charArray = new char[] { 'a', 'b', 'c', 'd', 'e', 'f' ,'g'};
- sw.Write(charArray , 3, 4);
執行結果:defg
- WriteLine() // 寫入流,後跟行結束符(行結束符樣式可用NewLine屬性設定)。(該方法有18種過載方法,只講常用的)
1、public virtual void WriteLine () //寫入空行,等同於跳到下一行
[csharp] view plaincopy- 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。
- MessageBox.Show(sw.Encoding.EncodingName);
- NewLine // 設定由當前 TextWriter 使用的行結束符字串樣式。
- sw.NewLine = "\t";
- sw.WriteLine("aaa");
- 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 開啟的檔案中進行讀取將導致異常。
- 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 組合即構成讀/寫訪問權。
- 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 允許隨後開啟檔案寫入。如果未指定此標誌,則檔案關閉前,任何開啟該檔案以進行寫入的請求(由此程序或另一進過程發出的請求)都將失敗。但是,即使指定了此標誌,仍可能需要附加許可權才能夠訪問該檔案。
- 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)
- 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 倍。
- 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 指示系統應通過任何中間快取、直接寫入磁碟。
- 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讀寫有中文的文字。
- byte[] byteArray = new byte[512];
- char[] charArray = new char[512];
- int byteCount = fs.Read(byteArray, 0, 512);
- System.Text.Encoding.GetEncoding("GB2312").GetChars(byteArray,0,byteCount,charArray,0);
- for (int i = 0; i < byteCount; i++)
- {
- MessageBox.Show(charArray[i].ToString());
- }
- ReadByte() // 從檔案中讀取一個位元組,並將讀取位置提升一個位元組。(沒法讀取中文)
函式原型:public override int ReadByte () //返回的字元的ASCII的十進位制數,流的末尾讀取則為 -1
- int b = 0;
- while((b = fs.ReadByte())!=-1)
- {
- MessageBox.Show(Convert.ToChar(b).ToString());
- }
- Seek() // 將該流的當前位置設定為給定值。
函式原型:public override long Seek (long offset,SeekOrigin origin) //相對於origin 的點,從此偏移offset個位元組處開始查詢。(按位元組偏移的,而不是字元)
SeekOrigin成員:- (1)Begin 指定流的開頭。
- (2)Current 指定流內的當前位置。
- (3)End 指定流的結尾。
- int b = 0;
- fs.Seek(2, SeekOrigin.Begin); //檔案指標偏移到第2個位元組
- b = fs.ReadByte();
- MessageBox.Show(Convert.ToChar(b).ToString());
- fs.Seek(-3, SeekOrigin.End); //檔案指標從檔案末尾往回偏移3個位元組
- b = fs.ReadByte();
- MessageBox.Show(Convert.ToChar(b).ToString());
假設檔案的內容是:abcdefghijk 那結果就是:c 和 j
- Write() //使用從緩衝區讀取的資料將位元組塊寫入該流。
函式原型:public override void Write (byte[] array,int offset,int count) // 將位元組陣列從offset位開始寫入count個位元組
- byte[] byteArray = new byte[] { 97,98,99,100,110,120}; //位元組陣列
- fs.Write(byteArray, 0, byteArray.Length);
執行結果:abcdnx
- WriteByte() //將一個位元組寫入檔案流的當前位置。
函式原型:public override void WriteByte (byte value)
- byte b = 97;
- 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倍操作速度哦!