FileStream讀寫文件和(StreamReader、StreamWriter)


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("寫入成功");


復制多媒體文件

  using (FileStream fsRead = new FileStream(@"C:\Users\Admin\Desktop\Test\測試視頻.wmv", FileMode.OpenOrCreate, FileAccess.Read))
            {


                using (FileStream fsWrite = new FileStream(@"C:\Users\Admin\Desktop\Test\new.wmv", FileMode.OpenOrCreate, FileAccess.Write))
                {
                        //創建字符數組緩沖區
                    byte[] buffer = new byte[1024 * 1024 * 5];//5M

                    while (true)//讀取的文件可能比較大,所以要循環讀,每次都是讀取5M
                    {

                        int r = fsRead.Read(buffer, 0, buffer.Length);

                        if (r == 0)//判斷是否讀取完畢
                        {
                            break;
                        }

                        //最后一次讀取到的數據可能小於5M,所以這里用r比較好
                        fsWrite.Write(buffer, 0, r);


                    }

                }



            }

            Console.WriteLine("復制成功");



StreamReader和StreamWriter

這個兩個流是用於操作文本的文本流

StreamReader讀取,讀取文本的時候是一行一行的讀取的

////Encoding.Default參數亂碼的時候可以加,不亂碼可以不加
            using (StreamReader sRead = new StreamReader(@"C:\Users\Admin\Desktop\Test\new.txt", Encoding.Default))
            {

                ////讀取一行
                //Console.WriteLine(sRead.ReadLine());

                //讀取全部行
                while (!sRead.EndOfStream)//判斷是否讀到了這個流的結尾
                {
                    Console.WriteLine(sRead.ReadLine());
                }

            }


StreamWriter寫入

//在第二個參數后面放true表示不覆蓋寫入,默認是覆蓋寫入
            using (StreamWriter sWrite=new StreamWriter(@"C:\Users\Admin\Desktop\Test\1.txt",true))
            {
                sWrite.Write("看我有沒有把你覆蓋");//第二個參數可以指定編碼格式
            }

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM