【C#IO 操作】stream 字节流|字符流 |比特流
stream的简介
Stream 所有流的抽象基类。 流是字节序列的抽象,例如文件、输入/输出设备、进程中通信管道或 TCP/IP 套接字。 Stream类及其派生类提供这些不同类型的输入和输出的一般视图,并将程序员与操作系统和基础设备的具体详细信息隔离开来。
.net中对于IO流的支持分为两个层次:基于比特的和基于字节两种方式,字符流是基于字节流的,用不同的编码方式读取字节流。
字符流:实现System.IO.TextReader和TextWaiter抽象类是所有基于字符流的父类,以特定编码从字节流中读取字符。
字节流:基于字节的方式适用于操作二进制文件,比如exe文件、视频、音频文件等等。
Stream抽象类是所有基于字节方式的流的父类。
字符流中TextReader和TextWaiter是抽象类是stream的读写器。
stream的操作方式
流涉及三个基本操作:
-
可以从流中读取。 读取是将数据从流传输到数据结构(如字节数组)中。
-
可以写入流。 写入是指将数据从数据结构传输到流中。
-
流可以支持查找。 查找是指查询和修改流中的当前位置。 查找功能取决于流具有的后备存储的类型。 例如,网络流没有当前位置的统一概念,因此通常不支持查找。
继承自的一些常用流 Stream 是 FileStream 、和 MemoryStream 。
根据基础数据源或存储库,流可能只支持其中一些功能。 您可以使用 CanRead 类的、和属性查询流的功能 CanWrite CanSeek Stream 。
Read和 Write 方法读取和写入各种格式的数据。 对于支持查找的流,请使用 Seek 和 SetLength 方法,并使用 Position 和 Length 属性来查询和修改流的当前位置和长度。
此类型实现 IDisposable 接口。 在使用完类型后,您应直接或间接释放类型。 若要直接释放类型,请在
try
/catch
块中调用其 Dispose 方法。 若要间接释放类型,请使用using
(在 C# 中)或Using
(在 Visual Basic 中)等语言构造。 有关详细信息,请参阅 IDisposable 接口主题中的“使用实现 IDisposable 的对象”一节。释放 Stream 对象将刷新所有缓冲数据,并在本质上调用 Flush 方法。 Dispose 还会释放操作系统资源(如文件句柄、网络连接或用于任何内部缓冲的内存)。 BufferedStream类提供了围绕另一个流包装缓冲流以提高读写性能的功能。
从 .NET Framework 4.5 开始, Stream 类包括异步方法来简化异步操作。 异步方法
Async
在其名称中包含,例如 ReadAsync 、、 WriteAsync CopyToAsync 和 FlushAsync 。 利用这些方法,您可以在不阻塞主线程的情况下执行占用大量资源的 i/o 操作。 在 Windows 8.x 应用商店应用或桌面应用中一个耗时的流操作可能阻塞 UI 线程并让应用看起来好像不工作时,这种性能的考虑就显得尤为重要了。 异步方法与async
await
Visual Basic 和 c # 中的和关键字结合使用。在 Windows 8.x 应用商店应用中使用时, Stream 包括两个扩展方法: AsInputStream 和 AsOutputStream 。 这些方法将 Stream 对象转换为 Windows 运行时中的流。 还可以使用和方法将 Windows 运行时中的流转换为 Stream 对象 AsStreamForRead AsStreamForWrite 。 有关详细信息,请参阅 如何:在 .NET Framework 流和 Windows 运行时流之间转换
某些流实现执行基础数据的本地缓冲以提高性能。 对于此类流,可以使用 Flush 或 FlushAsync 方法来清除任何内部缓冲区,并确保所有数据都已写入基础数据源或存储库。
如果需要一个没有后备存储的流 (也称为 "位桶") ,请使用 Null 字段检索为此目的而设计的流的实例。
-