使用FileStream讀寫資料
這節講一下使用FileStream讀寫資料,這是一個比較基礎的流。
FileStream類只能處理原始位元組,所以它可以處理任何型別的檔案。
先看一下它的構造方法:
FileStream fs = new FileStream("./demo.txt", FileMode.Open, FileAccess.Read);
這個方法最少有兩個引數,也就是前兩個,第一個是檔案路徑,第二個FileMode列舉,規定檔案的開啟方式,是正常開啟還是建立等等,第三個是FileAccess列舉,規定流的訪問形式,是寫入還是讀取等等,不指明這個引數,它的預設值是ReadWrite,也就是可讀可寫。
FileMode列舉成員:
FileAccess列舉成員:
File和FileInfo類都提供了OpenRead()和OpenWrite()這兩個方法,可以快速建立只讀或者只寫的FileStream物件。
讀寫檔案:
讀取檔案,需要用到Read()和Write(),這兩個方法最常用的過載如下所示:
len=fs.Read(buffer, 0, buffer.Length) write.Write(buffer, 0, len)
buffer是一個位元組陣列,用於存放一次讀取的位元組,可以自定義大小;第二個引數是偏移量,指示從buffer的第幾個索引開始讀,一般都是0,從開始讀取;第三個引數是一次讀取的大小,這個一般也都是固定的,是陣列的長度。Read()方法的返回值是本次讀取實際讀取 的長度,因為存在最後一次讀取的長度不滿buffer的長度的情況,Write()方法,第三個引數是指定寫入的長度,這裡一般指定Read()方法的返回值,這樣就不會出現將多餘的無關資料寫入檔案中。
下面看一下例子:
//讀取資料並展示 FileStream fs = new FileStream("./demo.txt", FileMode.Open, FileAccess.Read); int len, i = 0; //存放每次讀取的資料 byte[] buffer = new byte[5]; //存放所有讀到的資料,最後將其轉換為字串 byte[] data = new byte[fs.Length]; //迴圈讀取檔案 while ((len = fs.Read(buffer, 0, buffer.Length)) != 0) { for (int j = 0; j < len; j++) { data[i++] = buffer[j]; } } //jiang Console.WriteLine(Encoding.UTF8.GetChars(data)); //資料寫入 FileStream write = new FileStream("./demo_copy.txt", FileMode.Create, FileAccess.Write); //重置指標 fs.Seek(0, SeekOrigin.Begin); while ((len = fs.Read(buffer, 0, buffer.Length)) != 0) { write.Write(buffer, 0, len); } fs.Dispose(); write.Dispose();
第23行用到了一個方法Seek(),這個是用來設定當前檔案指標的位置的,一般情況下,檔案讀到哪指標就指到哪,而通過這個方法,可以重新設定指標的位置,它的第一個引數是偏移量,為正數則向後移動,為負數則向前移動,第二個引數是SeekOrigin列舉,它有三個成員,Begin,End,Current,分別指示檔案的開始,結束和當前位置,偏移量根據這個列舉值進行移動。
另外,操作結束後要及時釋放資源,或者一開始使用using引用要釋放的物件。
這是我的公眾號二維碼,獲取最新文章,請關注此號