C#使用流
溪流对我来说有点神秘。我不知道何时使用哪个流以及如何使用它们。有人能给我解释一下流是如何使用的吗 如果我理解正确,有三种流类型:C#使用流,c#,stream,C#,Stream,溪流对我来说有点神秘。我不知道何时使用哪个流以及如何使用它们。有人能给我解释一下流是如何使用的吗 如果我理解正确,有三种流类型: 流 读取流 写入流 这是正确的吗?例如,Memorystream和FileStream之间的区别是什么?我会从阅读MSDN上的流开始: Memorystream和FileStream是分别用于处理原始内存和文件的流。只有一种基本类型的流。但是,在各种情况下,一些成员在调用时会抛出异常,因为在该上下文中操作不可用 例如,内存流只是将字节移入和移出内存块的一种方式。
流
读取流
写入流
这是正确的吗?例如,
Memorystream
和FileStream
之间的区别是什么?我会从阅读MSDN上的流开始:
Memorystream和FileStream是分别用于处理原始内存和文件的流。只有一种基本类型的
流。但是,在各种情况下,一些成员在调用时会抛出异常,因为在该上下文中操作不可用
例如,内存流
只是将字节移入和移出内存块的一种方式。因此,您可以在其上调用Read和Write
另一方面,FileStream
允许您对文件进行读写(或两者兼有)。您是否可以实际读取或写入取决于文件的打开方式。如果只打开文件进行读取访问,则无法写入文件。我不会将这些流称为不同类型的流。Stream类具有CanRead和CanWrite属性,它们告诉您是否可以读取和写入特定流
不同流类(如MemoryStream与FileStream)之间的主要区别在于备份存储—数据从中读取或写入的位置。从名字上看有点明显。MemoryStream只将数据存储在内存中,文件流由磁盘上的文件支持,网络流从网络读取数据等等。流适合处理大量数据。当无法同时将所有数据加载到内存中时,您可以将其作为流打开并处理其中的小块。a流是用于传输数据的对象。有一个通用流类System.IO.stream
,从中派生.NET中的所有其他流类。流
类处理字节
具体的流类用于处理字节以外的其他类型的数据。例如:
- 当外部源是文件时,使用
FileStream
类
MemoryStream
用于在内存中存储数据
System.Net.Sockets.NetworkStream
处理网络数据
读写器流,如StreamReader
和StreamWriter
不是流-它们不是从System.IO.Stream
派生的,它们旨在帮助从流中写入和读取数据 在此对其他答案进行一点扩展,并帮助解释您将看到的许多示例代码,大多数情况下,您不会直接读写流。流是传输数据的低级方式
您会注意到,用于读取和写入的函数都是面向字节的,例如WriteByte()。没有用于处理整数、字符串等的函数。这使得流非常通用,但如果您只想传输文本,则处理起来就不那么简单
但是,.NET提供了在本机类型和低级流接口之间转换的类,并为您在流之间传输数据。其中一些值得注意的类别包括:
StreamWriter // Badly named. Should be TextWriter.
StreamReader // Badly named. Should be TextReader.
BinaryWriter
BinaryReader
要使用这些类,首先获取流,然后创建上面的一个类并将其与流关联。例如
MemoryStream memoryStream = new MemoryStream();
StreamWriter myStreamWriter = new StreamWriter(memoryStream);
StreamReader和StreamWriter在本机类型及其字符串表示形式之间进行转换,然后将字符串作为字节在流中来回传输。所以
myStreamWriter.Write(123);
将“123”(三个字符“1”、“2”和“3”)写入流。如果您正在处理文本文件(例如html),您将使用StreamReader和StreamWriter类
鉴于
myBinaryWriter.Write(123);
将写入表示32位整数值123(0x7B、0x00、0x00、0x00)的四个字节。如果您处理的是二进制文件或网络协议,您可能会使用BinaryReader和BinaryWriter。(如果您正在与网络或其他系统交换数据,您需要注意,但这是另一篇文章。)流只是物理
字节流上的抽象(或包装)。该物理流
称为基流
。因此,始终存在一个基本流,在其上创建流包装器,因此包装器以基本流类型命名,即FileStream
,MemoryStream
等
流包装器的优点是,您可以使用统一的api与任何底层类型的流进行交互usb、文件等
为什么要将数据视为流-因为数据块是按需加载的,所以我们可以将数据作为块进行检查/处理,而不是将整个数据加载到内存中。这就是大多数程序处理大文件的方式,例如加密操作系统映像文件。您可能需要选中一个字节数组,然后为它创建一个包装器(流
),它公开了一些有用的方法,例如读、写和更改位置。现在,您可以基于从Stream
继承的备份存储(FileStream、MemoryStream)创建类,并基于特定的备份存储构建该功能。因此,如果我理解正确,该流包含数据,并且不做任何处理。读写器“helper”类可以处理(操纵)流中的数据?不,流不是数据容器,它用于传输数据,例如FileStream将数据从字节[]传输到物理文件,NetworkStream通过套接字传输字节[]。Reader-Writer类是从流中写入和读取的帮助器类,例如,StreamReader可用于从St