C# MemoryStream类案例详解

  static void Main(string[] args)

  {

  //属性测试

  MemoryStream ms = new MemoryStream();

  Console.WriteLine(ms.CanRead); //True 内存流可读

  Console.WriteLine(ms.CanSeek); //True 内存流支持查找,指针移来移去的查找

  Console.WriteLine(ms.CanTimeout); //False 内存流不支持超时

  Console.WriteLine(ms.CanWrite); //True 内存流可写

  Console.WriteLine(ms.Capacity); //0 分配给该流的字节数

  byte[] bytes = Encoding.UTF8.GetBytes("abcdedcba");

  ms.Write(bytes, 0, bytes.Length); //已将一段文本写入内存

  Console.WriteLine(ms.Capacity); //256 再次读取为文本流分配的字节数已经变成了256,看来内存流是根据需要的多少来分配的

  Console.WriteLine(ms.Length); //9 这个是流长度,通常与英文的字符数一样,真正占用的字节数。

  Console.WriteLine(ms.Position); //9 流当前的位置,该属性可读可设置

  //Console.WriteLine(ms.ReadTimeout); 由于流不支持超时,此属性如果读取或者设置的话会报错

  //Console.WriteLine(ms.WriteTimeout); 由于流不支持超时,此属性如果读取或者设置的话会报错

  //方法测试

  byte[] byte1 = ms.GetBuffer(); //返回无符号字节数组 差点被忽悠了,无符号字节数组 其实就是byte(0~255),有符号字节sbyte(-128~127)

  string str1 = Encoding.UTF8.GetString(byte1);

  Console.WriteLine(str1); //输出 abcdedcba

  ms.Seek(2, SeekOrigin.Current); //设置当前流正在读取的位置 为开始位置即从0开始

  //从内存中读取一个字节

  int i = ms.ReadByte();

  Console.WriteLine(i); //输出99

  byte[] bytes3 = ms.ToArray();

  foreach (byte b in bytes3)

  {

  Console.Write(b + "-");//用于对比 输出 97-98-99-100-101-100-99-98-97- 可以看到 0,1,2第二位刚好是99

  }

  MemoryStream ms2 = new MemoryStream();

  byte[] bytes6 = Encoding.UTF8.GetBytes("abcde");

  ms2.Write(bytes6, 0, bytes6.Length);

  Console.WriteLine(ms2.Position); //输出5 写完之后流的位置就到了最后,因此想用read读取必须加下面这一行代码。

  //ms2.Seek(0, SeekOrigin.Begin); //想要用Read方法读取完整的流,必须设置当前位置,Read是从Position的位置开始读。

  ms2.Position = 0; //Read是从当前位置开始读,这行代码和上面一行意义一样。

  byte[] byteArray = new byte[5] { 110, 110, 110, 110, 110 }; //99是经过YTF8解码之后是 n

  ms2.Read(byteArray, 2, 1); //读取一个字节,byteArray的第一个元素中,(注意从0开始)

  Console.WriteLine(Encoding.UTF8.GetString(byteArray)); //nnann

  //ms2.Read(byteArray, 2, 2);

  //Console.WriteLine(Encoding.UTF8.GetString(byteArray)); //nnabn //当超出接收数组总长度的时候,后面的元素会被移开

  //设置当前流的长度

  Console.WriteLine(ms.Length); //输出9 当前流的长度是9

  ms.SetLength(20);

  Console.WriteLine(ms.Length); //输出20

  foreach (byte b in ms.ToArray()) //将流的内容也就是内存中的内容转换字节数组

  {

  Console.Write(b + "-"); //输出 97-98-99-100-101-100-99-98-97-0-0-0-0-0-0-0-0-0 由于设置了长度,因此空的自动补0

  }

  Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray())); //输出 abcdedcba 虽然长度变长了,但是没影响读取数据

  MemoryStream ms1 = new MemoryStream();

  byte[] bytes4 = ms1.ToArray();

  Console.WriteLine("此内存流并没有写入数据(Write)" + Encoding.UTF8.GetString(bytes4));//输出 此内存流并没有写入数据(Write) 因为内存为空

  //下面来一个指定位置的写入

  MemoryStream ms3 = new MemoryStream();

  byte[] bytesArr = Encoding.ASCII.GetBytes("abcdefg");

  ms3.Write(bytesArr, 0, bytesArr.Length);

  ms3.Position = 2;

  ms3.WriteByte(97); //97代表的是a 这段代码的意思是,将原先第二个的c替换为a

  string str = Encoding.ASCII.GetString(ms3.ToArray());

  Console.WriteLine(str); //输出 abacdefg

  byte[] byteArr1 = Encoding.ASCII.GetBytes("kk");

  ms3.Position = 4;

  ms3.Write(byteArr1, 0, byteArr1.Length);

  Console.WriteLine(Encoding.UTF8.GetString(ms3.ToArray())); //abadkkg //从第4位替换掉了两个字节为KK

  Console.ReadKey();

  }