C#文件操作的stream介紹及區別(轉)


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類來處理網絡文件。

 


免責聲明!

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



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