平時很少用到文件操作和流,所以每次用的時候都是百度,不明不白,Copy過去就行了,中間也有去整理,由於沒有記筆記,用得少,一段時間又忘記了。這次來一次徹徹底底的梳理。
一、繼承關係圖
二、文件和文件夾操作類
File和FileInfo:是文件操作類,可以對文件進行創建、修改、刪除、移動等,只要對文件能進行的操作都有提供。
Directory和DirectoryInfo:是文件夾操作類,提供了創建、刪除、移動文件夾,獲取文件夾的子文件夾等。
其中File和Directory都是靜態類。區別在於File和Directory在操作同一個文件/文件夾的時候,每次都會進行安全檢查。而FileInfo和DirectoreyInfo在操作同一個文件/文件夾的時間,只會檢查一次。
三、Writer操作類
Writer相關類:
顧名思義,Writer相關類都是寫入到流、字符串中。下面幾種Writer就與之對應。
3.1 BinaryWriter:
構造函數需要傳遞Stream,而BinaryWriter就是將二進制寫入到此流中去,如果這個流是通過文件獲得,則文件就會寫到文件中。如果流通過內存獲得,就會寫入到內存中。
byte[] data = new byte[10]; using (BinaryWriter binaryWriter = new BinaryWriter(File.Open(@"c:\1.txt", FileMode.Create)))//流從文件中獲取,寫入流也就是寫入文件 { binaryWriter.Write("a"); binaryWriter.Write(56); binaryWriter.Write(false); binaryWriter.Write(data); binaryWriter.Write('b'); binaryWriter.Flush(); } using (MemoryStream memoryStream = new MemoryStream())//流從內存中獲取,寫入流也就是寫入內存中 { BinaryWriter binaryWriter = new BinaryWriter(memoryStream); binaryWriter.Write("a"); binaryWriter.Write(56); binaryWriter.Write(false); binaryWriter.Write(data); binaryWriter.Write('b'); binaryWriter.Flush(); data = new byte[10]; memoryStream.Seek(0, SeekOrigin.Begin); memoryStream.Read(data, 0, (int)memoryStream.Length); }
3.2 StreamWriter:
構造函數需要傳遞Stream或者文件路徑。跟BinaryWriter很像,主要方法也是Write方法,而且他的Write方法跟BinaryWriter一樣,它的寫入對象也是流。
using (StreamWriter streamWriter = new StreamWriter(File.Open(@"c:\3.txt", FileMode.Create))) { streamWriter.Write("a"); streamWriter.Write(56); streamWriter.Write(false); streamWriter.Write(data); streamWriter.Write('b'); streamWriter.Flush(); }
StreamWriter和BinaryWriter的區別:
BinaryWriter:查看源碼可以看到,在寫入流之前,會將Int、Double、decimal、long、float的值轉爲字節數組,然後寫入文件流。在寫入string類型的,會將String類型變爲四個無符號整數,這就導致在打開二進制文本的時候前面多個0100 打開文本顯示的是ETO。BinaryWriter本質上將二進制寫入流中。
StreamWriter:所見即所得。你寫入文件中流的內容,打開文件和你看到的一樣。而BinaryWriter寫入到文件,打開是會亂碼的。
3.3 StringWriter:
構造函數需要傳遞StringBuilder,將數據寫入到StringBuilder中。所以StringWriter只能對字符串操作。
四、Reader操作類
跟Writer類似,相反,就不過多少了。