C#文件操作的stream介紹及區別(轉) 1、使用FileStream讀寫文件 文件頭: using System; using System.Collections.Generic; using System.Text; using System.IO; 讀文件核心代碼: byte[] byData = new byte[100]; char[] charData = new char[1000]; try { FileStream sFile = new FileStream("文件路徑",FileMode.Open); sFile.Seek(55, SeekOrigin.Begin); sFile.Read(byData, 0, 100); //第一個參數是被傳進來的字節數組,用以接受FileStream對象中的數據,第2個參數是字節數組中開始寫入數據的位置,它通常是0,表示從數組的開端文件中向數組寫數據,最后一個參數規定從文件讀多少字符. } catch (IOException e) { Console.WriteLine("An IO exception has been thrown!"); Console.WriteLine(e.ToString()); Console.ReadLine(); return; } Decoder d = Encoding.UTF8.GetDecoder(); d.GetChars(byData, 0, byData.Length, charData, 0); Console.WriteLine(charData); Console.ReadLine(); 寫文件核心代碼: FileStream fs = new FileStream(文件路徑,FileMode.Create); //獲得字節數組 byte [] data =new UTF8Encoding().GetBytes(String); //開始寫入 fs.Write(data,0,data.Length); //清空緩沖區、關閉流 fs.Flush(); fs.Close(); 2、使用StreamReader和StreamWriter 文件頭: using System; using System.Collections.Generic; using System.Text; using System.IO; StreamReader讀取文件: StreamReader objReader = new StreamReader(文件路徑); string sLine=""; ArrayList LineList = new ArrayList(); while (sLine != null) { sLine = objReader.ReadLine(); if (sLine != null&&!sLine.Equals("")) LineList.Add(sLine); } objReader.Close(); return LineList; StreamWriter寫文件: FileStream fs = new FileStream(文件路徑, FileMode.Create); StreamWriter sw = new StreamWriter(fs); //開始寫入 sw.Write(String); //清空緩沖區 sw.Flush(); //關閉流 sw.Close(); fs.Close(); =================================================================================== 方式一:用FileStream //實例化一個保存文件對話框 SaveFileDialog sf = new SaveFileDialog(); //設置文件保存類型 sf.Filter = "txt文件|*.txt|所有文件|*.*"; //如果用戶沒有輸入擴展名,自動追加后綴 sf.AddExtension = true; //設置標題 sf.Title = "寫文件"; //如果用戶點擊了保存按鈕 if(sf.ShowDialog()==DialogResult.OK) { //實例化一個文件流--->與寫入文件相關聯 FileStream fs = new FileStream(sf.FileName,FileMode.Create); //獲得字節數組 byte [] data =new UTF8Encoding().GetBytes(this.textBox1.Text); //開始寫入 fs.Write(data,0,data.Length); //清空緩沖區、關閉流 fs.Flush(); fs.Close(); } 方式二:用StreamWriter //實例化一個保存文件對話框 SaveFileDialog sf = new SaveFileDialog(); //設置文件保存類型 sf.Filter = "txt文件|*.txt|所有文件|*.*"; //如果用戶沒有輸入擴展名,自動追加后綴 sf.AddExtension = true; //設置標題 sf.Title = "寫文件"; //如果用戶點擊了保存按鈕 if (sf.ShowDialog() == DialogResult.OK) { //實例化一個文件流--->與寫入文件相關聯 FileStream fs = new FileStream(sf.FileName, FileMode.Create); //實例化一個StreamWriter-->與fs相關聯 StreamWriter sw = new StreamWriter(fs); //開始寫入 sw.Write(this.textBox1.Text); //清空緩沖區 sw.Flush(); //關閉流 sw.Close(); fs.Close(); } string FileName = Guid.NewGuid().ToString() + ".txt"; //GUID生成唯一文件名 StringBuilder ckpw = new StringBuilder("/"憑證輸出/", /"V800/", /"001/", /"東風隨州專用汽車有限公司/"," + "/"F89自由項16/", /"F90審核日期:/""); if (!FileIO.IsFolderExists(Server.MapPath("pzsc"))) FileIO.CreaterFolder(Server.MapPath(""), "file://pzsc/"); string filePath = Server.MapPath("pzsc") + "//" + FileName; System.IO.StreamWriter sw = new System.IO.StreamWriter(filePath, false, Encoding.GetEncoding("GB2312"));//創建的時候需要指定編碼格式,默認是UTF-8,中文顯示亂碼 sw.WriteLine(ckpw.ToString()); sw.Close(); 方式三:用BinaryWriter //實例化一個保存文件對話框 SaveFileDialog sf = new SaveFileDialog(); //設置文件保存類型 sf.Filter = "txt文件|*.txt|所有文件|*.*"; //如果用戶沒有輸入擴展名,自動追加后綴 sf.AddExtension = true; //設置標題 sf.Title = "寫文件"; //如果用戶點擊了保存按鈕 if (sf.ShowDialog() == DialogResult.OK) { //實例化一個文件流--->與寫入文件相關聯 FileStream fs = new FileStream(sf.FileName, FileMode.Create); //實例化BinaryWriter BinaryWriter bw = new BinaryWriter(fs); bw.Write(this.textBox1.Text); //清空緩沖區 bw.Flush(); //關閉流 bw.Close(); fs.Close(); } C#緩存流示例------>用緩存流復制文件 C#文件處理操作必須先導入命名空間:using System.IO; 背景:使用VS2005、一個按鈕、一個窗體、C#緩存流、把D:/KuGoo/愛得太多.wma復制到D:/並更名為love.wma,即:D:/love.wma 在按鈕的Click事件中添加如下代碼: private void button1_Click(object sender, EventArgs e) { //創建兩個文件流 一個是源文件相關,另一個是要寫入的文件 FileStream fs = new FileStream(@"D:/KuGoo/愛得太多.wma",FileMode.Open); FileStream fs2 = new FileStream(@"D:/love.wma",FileMode.Create); //創建一個字節數組,作為兩者之間的媒介 //好比兩個人拿蘋果,這個字節數組就好比一個籃子,一個人作死的把蘋果送到籃子里面, //而我就可以作死得拿蘋果,通過這個媒介我們互不干擾, //不需要互相等待【她往籃子里面放了蘋果我才可以去拿】,提高了效率 byte[] data = new byte[1024]; //創建兩個緩沖流,與兩個文件流相關聯 BufferedStream bs = new BufferedStream(fs); BufferedStream bs2= new BufferedStream(fs2); //fs作死的讀,fs2作死的寫,直到fs沒有字節可讀fs2就不寫了 //好比,一個人作死的往籃子里面丟蘋果,另一個人作死得往籃子里面拿蘋果,直到籃子里面沒有蘋果拿了為止 //即-->那個人沒有蘋果往籃子里面放了 while(fs.Read(data,0,data.Length)>0) { fs2.Write(data,0,data.Length); fs2.Flush(); } //關閉流,好比兩個人累了,都要休息 呵呵o(∩_∩)o... fs.Close(); fs2.Close(); } C#內存流示例----->用內存流來讀取圖片 C#文件處理操作必須先導入命名空間:using System.IO; 背景:一個窗體、一個pictureBox、一個lable[沒有選擇圖片,lable的text為"圖片未選擇"],在pictureBox1的Click事件中添加如下代碼: private void pictureBox1_Click(object sender, EventArgs e) { //實例化一個打開文件對話框 OpenFileDialog op = new OpenFileDialog(); //設置文件的類型 op.Filter = "JPG圖片|*.jpg|GIF圖片|*.gif"; //如果用戶點擊了打開按鈕、選擇了正確的圖片路徑則進行如下操作: if(op.ShowDialog()==DialogResult.OK) { //清空文本 this.label1.Text = ""; //實例化一個文件流 FileStream fs = new FileStream(op.FileName, FileMode.Open); //把文件讀取到字節數組 byte[] data = new byte[fs.Length]; fs.Read(data, 0, data.Length); fs.Close(); //實例化一個內存流--->把從文件流中讀取的內容[字節數組]放到內存流中去 MemoryStream ms = new MemoryStream(data); //設置圖片框 pictureBox1中的圖片 this.pictureBox1.Image = Image.FromStream(ms); } } Stream System.IO為我們提供了一個抽象類Stream,Stream類支持對字節的讀寫操作。在Stream類中包括了對異步操作的支持。 既然Stream是抽象類,所有其它流的類就都必須從Steam類中繼承。Stream類及其子類共同構成了一個數據源和數據存儲的視圖,從而封裝了操作系統和底層存儲的各個細節,使程序員把注意力集中到程序的應用邏輯上來。 流包含以下基本操作: 讀操作(Reading)。即讀出流中的數據,把數據存放在另一種數據結構中,比如數組。 寫操作(Writting)。即從另一種數據結構中讀出數據,存放至流對象中。 搜索操作(Seeking)。即從流中的當前位置開始搜索,定位到指定的位置。 由於數據視圖的不同,一些流可能不同時支持以上的所有操作。比如網絡流就不支持搜索操作。Stream類提供了CanRead,CanWrite和CanSeek三種屬性,來表示流是否支持這些操作。 BinaryReader和BinaryWriter BinaryReader和BinaryWriter這兩個類提供了從字符串或原始數據到各種流之間的讀寫操作。 File和Directory File類支持對文件的基本操作,包括創建、拷貝、移動、刪除和打開一個文件。Directory類則用於執行常見的各種目錄操作,如創建、移動、瀏覽目錄及其子目錄。 File類和Directory類都是密封類。不象抽象類Stream,File類和Directory類可以被實例化,但它們不能被其它類繼承。 File類和Directory類的基類都是抽象類FileSystemEntry。本文發表於http://bianceng.cn(編程入門) Stream File類的靜態方法主要是用於創建FileStream類。一個FileStream類的實例實際上代表一個磁盤文件,它通過Seek()方法進行對文件的隨機訪問,也同時包含了流的標准輸入、標准輸出、標准錯誤等。FileStream默認對文件的打開方式是同步的,但它同樣很好地支持異步操作。 TextReader和TextWriter TextReader和TextWriter類都是抽象類。和Stream類的字節形式的輸入和輸出不同,它們用於Unicode字符的輸入和輸出。 StringReader和StringWriter StringReader和StringWriter在字符串中讀寫字符。 StreamReader和StreamWriter StreamReader和StreamWriter在流中讀寫字符。 BufferedStream BufferedStream是為諸如網絡流的其它流添加緩沖的一種流類型。其實,FileStream流自身內部含有緩沖,而MemorySteam流則不需要緩沖。一個BufferStream 類的實例可以由多個其它類型的流復合而成,以達到提高性能的目的。緩沖實際上是內存中的一個字節塊,利用緩沖可以避免操作系統頻繁地到磁盤上讀取數據,從而減輕了操作系統的負擔。 MemoryStream MemoryStream是一個無緩沖流,它所封裝的數據直接放在內存中,因此可以用於快速臨時存儲、進程間傳遞信息等。 NetworkSteam Networksteam表示在互聯網絡上傳遞的流。 當使用名字空間System.IO中提供的類時,對存儲數據的訪問權限必須符合操作系統的安全性要求。 注意:不要使用這些類來編寫應用程序對網絡文件進行的操作。因為Internet默認的安全政策是不允許對文件直接訪問。可以使用IsolatedStroage類來處理網絡文件。