標籤:style blog http ar color os 使用 sp strong
原文:http://www.cnblogs.com/Johnny_Z/archive/2011/09/12/2174148.html
前言
本篇文章簡單總結了在C#編程中經常會用到的一些流。比如說FileStream、MemoryStream、 BufferedStream、 NetWorkStream、 StreamReader/StreamWriter、 TextReader/TextWriter等的簡單用法。
內容
一 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);
將資料寫入磁碟檔案:
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();//關閉流
二 MemoryStream類
MemoryStream類主要用於操作記憶體中的資料。比如說網路中傳輸資料時可以用流的形式,當我們收到這些流資料時就可以聲明MemoryStream類來儲存並且處理它們。
MemoryStream操作字串:
1 string str = "Hi!你好!";2 byte[] array = Encoding.UTF8.GetBytes(str);//將字串轉化為位元組數組3 MemoryStream memory = new MemoryStream(array);//初始化MemoryStream類4 byte[] arrayNew = memory.ToArray();//將記憶體中的資料轉換為位元組數組5 string strNew = Encoding.UTF8.GetString(arrayNew);//將位元組數群組轉換為字串
三 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();
實際測試中,封裝流的方法在效率上並沒有太多的提升。使用其他流也可以封裝檔案流。如果想要保證不頻繁的讀取磁碟其實只要保證代碼不這樣做就可以了,所以其實在代碼上多加控制,也能保證程式不會經常的操作磁碟。
四 NetWorkStream類
NetWorkStream類是專門用來處理伺服器與用戶端通訊的流。它在網路編程中經常使用,主要是用來處理類似Socket、TcpClient和TcpListener這些類中得到的流。
簡單的TCP同步方式伺服器與用戶端通訊:
1 伺服器 2 TcpListener lis=new TcpListener(5000); //伺服器監聽 3 lis.Start();//啟動 4 Socket sock=lis.AcceptSocket();//阻塞,直到有用戶端串連 5 6 NetworkStream networkStream = new NetworkStream(sock);//得到Socket中的流 7 if (netStream.DataAvailable) //如果用戶端發送了訊息 8 { 9 byte[] data = new byte[1024]; //定義一個位元組數組,用來存放接收的資料10 int len = netStream.Read(data, 0, data.Length); //從位置開始,讀取到位元組數組末尾11 string line = Encoding.Default.GetString(data, 0, len); //把收到的位元組轉換為字串12 }
伺服器
1 伺服器 2 TcpListener lis=new TcpListener(5000); //伺服器監聽 3 lis.Start();//啟動 4 Socket sock=lis.AcceptSocket();//阻塞,直到有用戶端串連 5 6 NetworkStream networkStream = new NetworkStream(sock);//得到Socket中的流 7 if (netStream.DataAvailable) //如果用戶端發送了訊息 8 { 9 byte[] data = new byte[1024]; //定義一個位元組數組,用來存放接收的資料10 int len = netStream.Read(data, 0, data.Length); //從位置開始,讀取到位元組數組末尾11 string line = Encoding.Default.GetString(data, 0, len); //把收到的位元組轉換為字串12 }
用戶端
五 StreamReader/StreamWriter類
StreamReader/StreamWriter主要用來處理流資料。它們分別提供了高效的流讀取/寫入功能。
讀取與寫入:
1 StreamReader reader = new StreamReader("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();
六 TextReader/TextWriter類
TextReader/TextWriter類主要用來處理流資料。它們分別提供了高效的文字資料流讀取/寫入功能。
讀取與寫入:
1 TextReader textReader = new StringReader("Hi 你好");//初始化讀取流 2 TextWriter textWriter = new StringWriter();//初始化寫入流 3 4 char[] c=new char[4096]; 5 int chars = 0; 6 while ((chars = textReader.Read(c, 0, 4096)) > 0)//把流中資料寫入到字元數組中 7 { 8 textWriter.Write(c, 0, 4096);//從字元數組中讀取流 9 }10 11 string str= textWriter.ToString();//將流中資料寫到字串中12 textReader.Close();//關閉流13 textWriter.Close();
注意事項:
1.流使用後必須要關閉。
2.把流中資料載入到記憶體時要考慮記憶體溢出等問題。
C# 流總結