轉自:http://www.oseye.net/user/kevin/blog/86
一、StreamWriter和StreamReader
從上一篇博文可知文件流、內存流和網絡流操作的都是字節,每次都要進行字節序列的轉換,所以使用上比較麻煩。StreamWriter和StreamReader在對Stream底層進行了封裝,可以直接操作字符數據。
StreamWriter類主要完成一種特定的編碼從流中讀取字符的功能,它的構造函數和常用方法如下:
- StreamWriter(Stream stream),構造函數,StreamWriter不僅能對FileStream對象,而且能夠對NetWorkStream、MemoryStream等繼承了Stream類的流對象進行封裝;
- StreamWriter(string path),構造函數,如需要處理的是文件流,則可直接利用文件路徑創建以UTF8編碼的StreamWriter對象;
- Write(string value),方法,向數據流寫入數據;
- WriteLine(string value),方法,向數據流寫入數據,並追加一個換行符(Unix)或回車換行符(Windows);
- Close(),方法,關閉流,釋放資源;
StreamReader類主要以特定的編碼向流中寫入字符,它的構造函數和常用方法如下:
- StreamReader(Stream stream),構造函數,利用流對象創建StreamReader對象;
- StreamReader(string path),構造函數,如需要處理的是文件流,則可直接利用文件路徑創建以UTF8編碼的StreamReader對象;
- string ReadLine(),方法,讀取數據直到遇到換行符(Unix)或回車換行符(Windows);
- string ReadToEnd(),方法,讀取到文件尾的全部數據
- int Peek(),方法,返回數據中下一個可用字符的編碼值,如到達文件末尾則返回-1;
- Close(),方法,關閉流,釋放資源;
StreamWriter和StreamReader實例
try { //寫入 StreamWriter sw = new StreamWriter(@"d:\abc.txt"); sw.WriteLine("我愛我家"); sw.Close(); //讀取 StreamReader sr = new StreamReader(@"d:\abc.txt"); Console.WriteLine(sr.ReadToEnd()); } catch (Exception ex) { Console.WriteLine(ex.Message); }
二、BinaryReader和BinaryWriter
為了操作圖像、壓縮文件等二進制流文件,System.IO還提供了BinaryReader類和BinaryWriter類,用於二進制模式的讀寫流。
BinaryReader的每個讀方法都有一個對應的寫方法,比如針對不同的數據結構,BinaryReader類提供了ReadByte、ReadBoolean、ReadInt、ReadInt16、ReadString等,與之對應的BinaryReader類則提供了多個重載的Write方法,分別對應上面的讀方法,所以使用起來非常方便。例如,當Write方法傳遞的參數是Int32類型時,利用BinaryWriter的Write方法可用將Int32類型數據轉化為長度為4的字節數組,並將字節流傳遞給一個Stream對象。
BinaryReader和BinaryWriter實例
byte[] sendData; using (MemoryStream mem = new MemoryStream()) { BinaryWriter writer = new BinaryWriter(mem, Encoding.UTF8); writer.Write(SocketTools.strConvertToHexByte(SocketTools.md5(packageHead.CarIdentifier, 32))); writer.Write(packageHead.ProjectIdentifier); writer.Write(packageHead.ModelIdentifier); writer.Write(packageHead.ProtocolVersion); writer.Write(SocketTools.reverseShort(packageHead.RequestSerial)); writer.Write(SocketTools.reverseInt32(packageHead.PacketTimestamp)); writer.Write(SocketTools.reverseShort(packageHead.FunctionNo)); writer.Write(SocketTools.reverseShort(packageHead.DataLength)); writer.Write(msg.ToCharArray()); sendData = mem.ToArray(); writer.Close(); }