.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(); }