MemoryStream类相关

        public static void OnTestMemory()
        {
            //创建测试数据
            //CreateExampleData();

            //创建内存流对象,初始分配默认字节的缓冲区
            MemoryStream ms1 = new MemoryStream();

            //向内存流中写入字节数组的所有数据
            Console.WriteLine("写入数据前的内存流长度:{0} 分配的缓冲区大小:{1} 内存流当前的位置:{2}", ms1.Length.ToString(), ms1.Capacity.ToString(), ms1.Position.ToString());
            ms1.Write(buffer, 0, buffer.Length);
            Console.WriteLine("写入数据后的内存流长度:{0} 分配的缓冲区大小:{1} 内存流当前的位置:{2}", ms1.Length.ToString(), ms1.Capacity.ToString(), ms1.Position.ToString());

            byte[] byte1 = ms1.GetBuffer();
            string str1 = Encoding.UTF8.GetString(byte1);
            Console.WriteLine("当前流所有内容:{0}",str1);

            Console.WriteLine("内存流当前的位置:{0}", ms1.Position.ToString());
            //将读写指针移到距流开头2个字节的位置
            ms1.Seek(2, SeekOrigin.Begin);
            Console.WriteLine("调用Seek后当前的位置:{0},当前字节为:{1}", ms1.Position.ToString() , ms1.ReadByte().ToString());

            byte[] bytes3 = ms1.ToArray();
            Console.Write("获取把流写入字节数组的内容:");
            foreach (byte b in bytes3)
            {
                Console.Write(b + "-");//输出 97-98-99-100-101-100-99-98-97-   
            }
            Console.WriteLine("\n用于对比可以看到0,1,2第二位刚好是99");

            //设置当前流的长度
            Console.WriteLine(ms1.Length);   //输出9   当前流的长度是9
            ms1.SetLength(20);
            Console.WriteLine(ms1.Length);   //输出 20
            foreach (byte b in ms1.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("\n"+Encoding.UTF8.GetString(ms1.ToArray()));   //输出 abcdedcba   虽然长度变长了,但是没影响读取数据
            Console.WriteLine("\n下一个!!");

            MemoryStream ms2 = new MemoryStream();
            byte[] bytes6 = Encoding.UTF8.GetBytes("abcde");
            ms2.Write(bytes6, 0, bytes6.Length);
            Console.WriteLine("当前位置{0}",ms2.Position);    //输出 5 写完之后流的位置就到了最后,因此想用Read读取必须加下面这一行代码。 

            //ms2.Seek(0, SeekOrigin.Begin);    //想要用Read方法读取完整的流,必须设置当前的位置,既Read从Position的位置开始读。
            ms2.Position = 0;                   //Read现在从位置“0”开始读,这行代码和上面一行意义一样。
            byte[] byteArray = new byte[5] { 110, 110, 110, 110, 110 }; //110是经过UTF8解码之后为“n”
            Console.WriteLine("Read前:{0}", Encoding.UTF8.GetString(byteArray)); //输出 nnnnn
            //ms2.Read(byteArray, 2, 1);   //读取一个字节,byteArray的第一个元素中,(注意从0开始)
            //Console.WriteLine("Read后:{0}",Encoding.UTF8.GetString(byteArray)); //输出 nnann
            ms2.Read(byteArray, 2, byteArray.Length - 2);
            Console.WriteLine("Read后:{0}", Encoding.UTF8.GetString(byteArray)); //输出 nnabc    //当超出接收数组总长度的时候,后面的元素会被移开
            Console.WriteLine("\n下一个!!");

            MemoryStream ms3 = new MemoryStream();
            byte[] bytes4 = ms3.ToArray();
            Console.WriteLine("此内存流并没有写入数据(Write): [{0}]",Encoding.UTF8.GetString(bytes4));//输出    此内存流并没有写入数据(Write)  因为内存为空
            Console.WriteLine("\n下一个!!");

            //下面来一个指定位置的写入
            MemoryStream ms4 = new MemoryStream();
            byte[] bytesArr = Encoding.ASCII.GetBytes("abcdefg");
            ms4.Write(bytesArr, 0, bytesArr.Length);
            ms4.Position = 2;
            ms4.WriteByte(97);  //97代表的是a   这段代码的意思是,将原先第3位的c替换为a
            string str = Encoding.ASCII.GetString(ms4.ToArray());
            Console.WriteLine(str); //输出 abadefg

            byte[] byteArr1 = Encoding.ASCII.GetBytes("kk");
            ms4.Position = 4;
            ms4.Write(byteArr1, 0, byteArr1.Length);

            var byteArr = ms4.ToArray();
            Console.WriteLine(Encoding.UTF8.GetString(byteArr));  //输出:abadkkg   //从第5位开始替换掉了两个字节为KK
            var byteBuf = ms4.GetBuffer();
            Console.WriteLine(Encoding.UTF8.GetString(byteBuf));     //输出:abadkkg  

            ms1.Close();
            ms2.Close();
            ms3.Close();
            ms4.Close();

猜你喜欢

转载自blog.csdn.net/le_sam/article/details/79046019