關於FileStream讀取大檔案問題

來源:互聯網
上載者:User

標籤:

小的文字檔(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讀取大檔案問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.