標籤:
這一周章老師講了有關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