1. 程式人生 > 其它 >FileStream讀寫檔案

FileStream讀寫檔案

FileStream

用於操作位元組(所有的檔案本質都是位元組形式存放的),也就是可以操作任意型別的檔案
這個檔案流可以用於操作大檔案,對記憶體壓力小

StreamReader和StreamWriter:用於操作字元(字串),方便用於操作文字檔案,和FileStream一樣,都是用於操作大檔案,這個針對文字檔案的讀寫。

FileStream和File類的區別

FileStream和File的區別:有兩個水缸,一個空的,一個滿水,要把滿水的給全部倒入空的裡,
File是把水缸扛起來,一次性把所有的水(檔案)倒入另一個水缸,(對記憶體不友好,因為他是把檔案一次性讀到記憶體裡面)
FileStream則是用勺子,一勺一勺的盛在另一個水缸(對記憶體友好)



FileStream讀取檔案

這裡先用來讀寫文字檔案舉例子

//第一步,建立FileStream的物件
            //FileStream例項化時必須要給建構函式傳引數,,一般使用三個引數
            //第一個引數:一般是檔案的路徑
            //第二個引數,表示針對這個檔案做的操作
            //第三個引數,表示你對這個檔案裡面的資料要進行的操作

            FileStream fileStreamRead = new FileStream(@"C:\Users\Admin\Desktop\Test\new.txt", FileMode.OpenOrCreate, FileAccess.Read);



            //第二步,建立位元組陣列,用於存放讀到的檔案,用該陣列的長度限定每次讀取的檔案的大小和陣列大小一致
            byte[] buffer = new byte[1024 * 1024 * 5];//每次讀取5M到記憶體中,然後存到該位元組陣列


            //第三步,呼叫讀取的方法
            //第一個引數,存放位元組的陣列,
            //第二個引數,開始往位元組數組裡寫入的位置
            //第三個引數,每次讀取的位元組大小
            //返回值,返回本次實際讀取到的有效位元組數,比如讀一個3.5M的檔案,你雖然給的是5M的空間,實際上也只返回3.5
            int r = fileStreamRead.Read(buffer, 0, buffer.Length);



            //第四步,將位元組陣列中每一個元素按照指定的編碼格式解碼成想要的格式,這裡我們轉解碼為字串
            //GetString第一個引數,要解碼的陣列,第二個引數,從陣列的哪個位元組開始解碼,第三個引數,解碼的長度,如果不寫第二個和第三個引數,你讀的檔案小於你陣列的長度(小於5M),他會把數組裡剩下的也解碼成空來填充
            string str = Encoding.Default.GetString(buffer, 0, r);//如果Default讀出來亂碼可以換成UTF8比如Encoding.UTF8.GetString(buffer, 0, r);


            //第五步,關閉資料流:
            fileStreamRead.Close();

            //第六步,釋放流所佔用的資源,GC垃圾回收器無法幫我們釋放資料流
            fileStreamRead.Dispose();

            //輸出
            Console.WriteLine(str);

FileStream寫入檔案

這裡先用來讀寫文字檔案舉例子
借用using幫助釋放資源,這樣就不用手動關閉流和釋放流,簡化流程

            //第一步,建立FileStream的物件
            using (FileStream fsWrite = new FileStream(@"C:\Users\Admin\Desktop\Test\new.txt", FileMode.OpenOrCreate, FileAccess.Write))
            {


                string str = "看我有沒有把你覆蓋";//準備寫入的資料

                byte[] buffer = Encoding.Default.GetBytes(str);//UTF的編碼格式寫如:Encoding.UTF8.GetBytes(str);

                //需要的引數和讀取的引數差不多
                fsWrite.Write(buffer, 0, buffer.Length);



            }

            Console.WriteLine("寫入成功");