-
C# MemoryStream类案例详解
MemoryStream位于System.IO命名空间,为系统内存提供流式的读写操作。常作为其他流数据交换时的中间对象操作。
- MemoryStream类封装一个字节数组,在构造实例时可以使用一个字节数组作为参数,但是数组的长度无法调整。使用默认无参数构造函数创建实例,可以使用Write方法写入,随着字节数据的写入,数组的大小自动调整。
- 在对MemoryStream类中数据流进行读取时,可以使用seek方法定位读取器的当前的位置,可以通过指定长度的数组一次性读取指定长度的数据。ReadByte方法每次读取一个字节,并将字节返回一个整数值。
- UnicodeEncoding类中定义了Unicode中UTF-16编码的相关功能。通过其中的方法将字符串转换为字节,也可以将字节转换为字符串。
MemoryStream 是一个特例,MemoryStream中没有任何非托管资源,所以它的Dispose不调用也没关系。托管资源.Net会自动回收
MemoryStream继承自Stream类。内存流的好处是指针可以晃来晃去,也就是支CanSeek,Position,Seek()。任意读其中一段。
在内存流中有必要了解一下SeekOrigin枚举
枚举成员 | 成员值 | 描述 |
---|---|---|
Begin | 0 | 指定流的开头。 |
Current | 1 | 指定流内的当前位置。 |
End | 2 | 指定流的结尾。 |
MemoryStream提供的属性与方法:
一、属性
CanRead 已重写。获取一个值,该值指示当前流是否支持读取。
CanSeek 已重写。获取一个值,该值指示当前流是否支持查找。
CanTimeout 获取一个值,该值确定当前流是否可以超时。(从 Stream 继承。)
CanWrite 已重写。获取一个值,该值指示当前流是否支持写入。
Capacity 获取或设置分配给该流的字节数。 这个是分配的字节数
Length 已重写。获取用字节表示的流长度。这个是真正占用的字节数。
Position 已重写。获取或设置流中的当前位置。
ReadTimeout 获取或设置一个值,该值确定流在超时前尝试读取多长时间。 (从 Stream 继承。)
WriteTimeout 获取或设置一个值,该值确定流在超时前尝试写入多长时间。 (从 Stream 继承。)
二、方法
BeginRead 开始异步读操作。 (从 Stream 继承。)
BeginWrite 开始异步写操作。 (从 Stream 继承。)
Close 关闭当前流并释放与之关联的所有资源(如套接字和文件句柄)。 (从 Stream 继承。)
CreateObjRef 创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 (从 MarshalByRefObject 继承。)
Dispose 已重载。
EndRead 等待挂起的异步读取完成。 (从 Stream 继承。)
EndWrite 结束异步写操作。 (从 Stream 继承。)
Flush 已重写。 重写 Stream.Flush 以便不执行任何操作。
GetBuffer 返回从其创建此流的无符号字节数组。 是会返回所有分配的字节,不管用没用到。
GetLifetimeService 检索控制此实例的生存期策略的当前生存期服务对象。 (从 MarshalByRefObject 继承。)
InitializeLifetimeService 获取控制此实例的生存期策略的生存期服务对象。 (从 MarshalByRefObject 继承。)
Read 已重写。 从当前流中读取字节块并将数据写入 buffer 中。 搞了好久才弄明白Read()方法的含义,第一个参数,是读取到的内容要输出到的字节数组,第二个参数是放在第一个参数即要输出的数组的位置的偏移量,第三个参数是,要读取的字符数。 用这个方法你可以任意读取一段需要的内存。注意,Read()方法是从当前流的Position属性的位置开始读,这就是为什么很多人测试的时候,刚刚写入内存的数据,Read()方法无法读取到内容的原因,因为刚刚写入内存之后,位置恰好是在最后一位了。Read()方法当然读不到。此方法强大之处在于,你可以从一个内存流中读出你想要的一个片段。
ReadByte 已重写。 从当前流中读取一个字节。
Seek 已重写。 将当前流中的位置设置为指定值。
SetLength 已重写。 将当前流的长度设为指定值。
Synchronized 在指定的 Stream 对象周围创建线程安全(同步)包装。 (从 Stream 继承。)
ToArray 将整个流内容写入字节数组,而与 Position 属性无关。
Write 已重写。 使用从缓冲区读取的数据将字节块写入当前流。 同样注意下,第二个参数是第一个参数数组的偏移量就可以了。
WriteByte 已重写。 将一个字节写入当前流中的当前位置。
WriteTo 将此内存流的整个内容写入另一个流中。
以下给出使用示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
|
接下来实现数据类的转换:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
到此这篇关于C# MemoryStream类案例详解的文章就介绍到这了
原文:https://www.jb51.net/article/220171.htm