C#學習(八)之Stream

來源:互聯網
上載者:User

標籤:

  這一周章老師講了有關Stream的知識,本次學習記錄就圍繞著Stream展開。

 

  首先先介紹C#中一些有關檔案操作的知識。

  先看下面的代碼:

 1 //從環境變數"SystemRoot"中得到特定字串的值,“SystemRoot”代表Windows系統啟動目錄 2  string theDirectory =  Environment.GetEnvironmentVariable("SystemRoot");  3  Console.WriteLine(theDirectory); 4  //得到目錄字元串theDirectory的對象dir 5  DirectoryInfo dir = new DirectoryInfo(theDirectory ); 6  //得到dir目錄對象的檔案集合 7  FileInfo[] filesInDir = dir.GetFiles(); 8  foreach (var item in filesInDir) 9  {10    Console.WriteLine(item.Name);11  }12  //得到dir對象的子目錄集合13   DirectoryInfo[] directories = dir.GetDirectories();14   foreach (var item in directories)15   {16     Console.WriteLine(item.Name);17   }                    

  輸出結果如下

  總結一下,上面的代碼就是將Windows系統啟動目錄(C:\Windows)裡的檔案和目錄的名字輸出到控制台。

 

  DirectoryInfo也可以傳入的地址為參數初始化,如

1 string theDirectory = @"c:\test\media“;2 DirectoryInfo dir = new DirectoryInfo(theDirectory);

  這樣就可開啟指定目錄進而操作。另外DirectoryInfo 和 FileInfo這兩個類也整合了許多函數提供了建立,複製,轉移,刪除等功能,此處就不一一介紹了。

 

  下面總結一下在C#編程中經常會用到的一些流。比如說FileStream、BufferedStream、 NetWorkStream、 StreamReader/StreamWriter等的簡單用法。

 

  1. FileStream類

      FileStream類主要用於讀取磁碟上的檔案或者向磁碟檔案寫入資訊。

    從磁碟上的檔案中讀取內容:

1 FileStream file = File.Open(@"F:\file.txt", FileMode.Open); //初始設定檔案流2 byte[] array = new byte[file.Length];//初始化位元組數組3 file.Read(array, 0, array.Length);//讀取流中資料把它寫到位元組數組中4 file.Close();//關閉流5 string str = Encoding.Default.GetString(array);//將位元組數組內容轉化為字串6 Console.WriteLine(str);

  輸出內容即為file.txt的內容。

  將資料寫入磁碟檔案:

1 FileStream file = File.Open(@"F:\file.txt", FileMode.Append);//初始設定檔案流2 byte[] array = Encoding.UTF8.GetBytes("Hello World!");//給位元組數組賦值3 file.Write(array, 0, array.Length);//將位元組數組寫入檔案流4 file.Close();//關閉流

  上面的代碼將“Hello World!”寫入了file.txt。

  

  

  2.BufferedStream類

     BufferedStream類主要也是用來處理流資料的,但是該類主要的功能是用來封裝其他流類。這麼做的意義是減少某些流直接操作存放裝置的時間。對於一些流來說直接向磁碟中儲存資料這種做法的效率並不高,用BufferedStream封裝過的流, 先在記憶體中進行統一的處理再向磁碟中寫入資料,也會提高寫入的效率。

     將磁碟上的一個檔案寫入到磁碟上的另一個檔案中:

 1 BufferedStream封裝流 2 FileStream file1 = File.Open(@"F:\file1.txt", FileMode.OpenOrCreate,FileAccess.Read);//讀取檔案流 3 FileStream file 2= File.Open(@"F:\file2.txt", FileMode.OpenOrCreate,FileAccess.Write);//寫入檔案流 4  5 byte[] array = new byte[4096]; 6        7 BufferedStream bufferedInput = new BufferedStream(file1);//封裝檔案流,讀取 8 BufferedStream bufferedOutput = new BufferedStream(file2);//封裝檔案流,寫入 9 10 bufferedInput.Read(array, 0, array.Length);11 bufferedOutput.Write(array, 0, array.Length);12 13 int bytesRead = 0;14 while ((bytesRead = bufferedInput.Read(array, 0, 4096)) > 0)//讀取到了資料15   {16     bufferedOutput.Write(array, 0, bytesRead);17     Console.WriteLine(bytesRead);18    }19 bufferedInput.Close();//關閉各種流20 bufferedOutput.Close();21 file1.Close();22 file2.Close();

  總結一下上面的代碼功能就是將file1的內容寫入file2。不過現在我們也許還用不到這個流,這裡也只是介紹一下其用法。

 

  3.NetWorkStream類

     NetWorkStream類是專門用來處理伺服器與用戶端通訊的流。它在網路編程中經常使用,主要是用來處理類似Socket、TcpClient和TcpListener這些類中得到的流。

     簡單的TCP同步方式伺服器與用戶端通訊:

  伺服器

 1 TcpListener lis=new TcpListener(5000); //伺服器監聽 2 lis.Start();//啟動 3 Socket sock=lis.AcceptSocket();//阻塞,直到有用戶端串連 4  5 NetworkStream networkStream = new NetworkStream(sock);//得到Socket中的流 6 if (netStream.DataAvailable)   //如果用戶端發送了訊息 7 { 8    byte[] data = new byte[1024];   //定義一個位元組數組,用來存放接收的資料 9    int len = netStream.Read(data, 0, data.Length);  //從位置開始,讀取到位元組數組末尾10    string line = Encoding.Default.GetString(data, 0, len);  //把收到的位元組轉換為字串11 }

  用戶端

1 TcpClient client = new TcpClient();//用戶端tcp對象2 client.Connect("127.0.0.1", 5000);//串連伺服器3 NetworkStream myStream = client.GetStream();//得到網路流4                 5 byte[] data = Encoding.Default.GetBytes("Hi,你好");  //首先把輸入的字串訊息轉換為位元組6 myStream .Write(data, 0, data.Length);  //向myStream 裡寫入資料7 myStream .Flush();  //重新整理流中的資料8 myStream .Close();

  

  4.StreamReader/StreamWriter類

     StreamReader/StreamWriter主要用來處理流資料。它們分別提供了高效的流讀取/寫入功能。

     讀取與寫入:

 1 StreamReader reader = new StreamReader("filePath");//初始化讀取,filePath為檔案位置 2 StreamWriter writer = new StreamWriter("filePath");//初始化寫入 3  4 string readStr=reader.ReadLine();//從流中讀取一行 5 string readAff = reader.ReadToEnd();//從流中讀取全部 6  7 writer.Write("Hi");//寫入內容 8 writer.WriteLine("Hi");//寫入一行 9 10 reader.Close();//關閉流11 writer.Close();

  上面的代碼也是對檔案進行讀寫操作,且比較高效。

 

  最後再介紹一下網路流,範例程式碼如下:

 1 HttpWebRequest webRequest 2         = (HttpWebRequest)WebRequest.Create("http://www.baidu.com/"); //http請求 3 HttpWebResponse webResponse 4         = (HttpWebResponse)webRequest.GetResponse(); 5 StreamReader streamReader = new StreamReader( 6         webResponse.GetResponseStream(), Encoding.ASCII);        //http應答 7 try                                       //處理網路異常 8  { 9     string outputString = streamReader.ReadToEnd();          10     Console.WriteLine(outputString);11   }12  catch { Console.WriteLine("Exception reading from web page"); }13  streamReader.Close();                            //關閉流

  上面的代碼就是將百度首頁的HTML代碼讀入然後輸出,也是比較簡單明了的。

 

  今天的學習記錄到此為止,以後有機會再補充一些內容。

 

  望各位老師大牛不吝賜教!

  

C#學習(八)之Stream

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.