標籤:
小的文字檔(100M以下)直接用File類的ReadAllText()和WriteAllText()方法
這兩個方法內部其實就是封裝了StreamReader類的ReadToEnd()和StreamWriter類的WriteToEnd(),
這兩個方法的傳回值都是string類型,所以只能讀寫文字檔
小的文字檔的單行讀寫用StreamReader和StreamWriter這兩個類
小的非文字檔用File類的ReadAllBytes()和WriteAllBytes()讀寫,並用byte[]作中轉站
這兩個方法內部其實就是封裝了FileStream的Read()和Write()方法,
這兩個方法的傳回值都是byte數組,所以可以讀寫任何檔案
大檔案
但File讀寫特大檔案是會出錯的,因為它雖然本質上用的是FileStream來讀寫,但是它的byte[]大小是寫死了的(就是被讀寫檔案的大小),所以它是將檔案一次性全部讀取或寫入,檔案非常大的時候往往會造成記憶體溢出,所以要用資料流FileStream,因為我們可以自由定義byte[]的大小,來保證記憶體不會溢出
一般而言,讀檔案用FileMode.Open,寫檔案用FileMode.Create,FileStream的Position屬性是一個指標,標記檔案流當前讀寫的位置
代碼實現:
1 using (FileStream fsRead = new FileStream(@"D:\Names.txt", FileMode.Open)) 2 { 3 using (FileStream fsWrite = new FileStream(@"d:\temp.txt", FileMode.Create)) 4 { 5 byte[] arr = new byte[200]; 6 //記錄到底讀取了多少位元組的資料 7 int count = 0; 8 while (fsRead.Position < fsRead.Length) 9 {10 //每一次讀取,。返回真正讀取到的位元組數,用count記錄(最後一次讀取後可能count可能會小於200)11 count = fsRead.Read(arr, 0, arr.Length);12 //將數組中的資料寫入到指定的檔案13 fsWrite.Write(arr, 0, count);14 }15 }16 MessageBox.Show("ok");17 }
結:
首先看檔案大小——如果是大檔案則用FileStream,如果是小檔案則看是否是文字檔——非文字檔則用File類的 ReadAllBytes/WriteAllBytes,是文字檔則看是否是單行讀寫——是則用StreamReader類/StreamWriter 類,不是則用File類的ReadAllText/WriteAllText
另,任意類型的檔案都可以用FileStream來讀寫
關於FileStream讀取大檔案問題