解释 .NET 中的流架构
.NET流体系结构为跨不同I/O类型的读写提供了一致的编程接口。它包括用于操作磁盘上的文件和目录的类,以及用于压缩、命名管道和内存映射文件的专用流。
.NET中的流架构依赖于后备存储和适配器。
后备商店
它代表数据存储,例如文件或网络连接。它既可以作为可以顺序读取字节的源,也可以作为可以顺序写入字节的目的地。
.NET中的Stream类向程序员公开后备存储。它公开了读取、写入和定位的方法。顾名思义,流是流动的数据,一次一个字节或特定大小的块。数据不会像数组一样一次性全部驻留在内存中。无论原始数据存储的大小如何,流都使用少量内存。
适配器
通常,流处理字节。尽管字节灵活且高效,但应用程序使用更高级别的抽象。TextReader/TextWriter或XMLReader/XMLWriter等适配器包装流并提供对更高级别数据结构(如文本字符串和XML)的访问。
流类
Stream类在System.IO命名空间中定义,并提供字节序列的通用视图。它是一个抽象类,充当所有流的基类。它公开了读取、写入和查找操作的方法,以及其他管理功能,如关闭和刷新。
Stream类具有以下成员-
特性
CanRead -如果当前流支持读取,则返回true。
CanSeek -如果当前流支持搜索,即查询和修改流中的当前位置,则返回true。
CanTimeout -如果当前流可以超时,则返回true。
CanWrite -如果当前流支持写入,则返回true。
Length -返回流的长度作为字节数。
Position -获取或设置当前流中的位置。
Readtimeout -获取或设置一个值(以毫秒为单位),该值确定流在超时之前将尝试读取多长时间。
WriteTimeout -获取或设置一个值(以毫秒为单位),该值确定流在超时之前尝试写入的时间。
方法
public abstract int Read (byte[] buffer, int offset, int count)
当在派生类中被重写时,从当前流中读取字节序列并将流中的位置推进读取的字节数。
public abstract void Write (byte[] buffer, int offset, int count)
当在派生类中被重写时,将字节序列写入当前流,并将此流中的当前位置推进写入的字节数。
public abstract long Seek (long offset, System.IO.SeekOrigin origin);
在派生类中重写时,设置当前流中的位置。
public abstract void Flush ();
当在派生类中被覆盖时,清除此流的所有缓冲区并导致任何缓冲数据写入底层设备。
示例
这是一个完整的示例,演示了Stream的用法。
using System; using System.IO; class Program{ static void Main(string[] args){ //在当前目录下创建一个名为test.txt的文件: using (Stream str = new FileStream("sample.txt", FileMode.Create)){ Console.WriteLine(str.CanRead); //真的 Console.WriteLine(str.CanWrite); //真的 Console.WriteLine(str.CanSeek); //真的 str.WriteByte(75); str.WriteByte(76); byte[] bytes = { 10, 20, 30 }; str.Write(bytes, 0, bytes.Length); //写入5个字节的块 Console.WriteLine(str.Length); //7 Console.WriteLine(str.Position); //7 str.Position = 0; //回到起点 Console.WriteLine(str.ReadByte()); // 101 Console.WriteLine(str.ReadByte()); //102 //从流中读回块数组: Console.WriteLine(str.Read(bytes, 0, bytes.Length)); //5 //假设最后一次Read返回5,我们将在 //文件的结尾,所以Read现在将返回0: Console.WriteLine(str.Read(bytes, 0, bytes.Length)); //0 } } }输出结果
True True True 5 5 75 76 3 0