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