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