.net 流(Stream) - StreamWriter和StreamReader、BinaryReader和BinaryWriter


轉自: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();
}

 


免責聲明!

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



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