流对我来说有点神秘。我不知道该使用哪个流以及如何使用它们。可以有人解释一下如何使用流吗?
如果我理解正确,有三种流类型:
流
读取流
写入流
这是正确的吗?例如,MemoryStream
和FileStream
之间有什么区别?
流(Stream)是用于传输数据的对象。在.NET中,所有其他流类都是从通用流类System.IO.Stream
派生而来的。 Stream
类处理字节。
具体的流类用于处理比字节更多类型的数据。例如:
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
要使用这些类,首先需要获取您的数据流(stream),然后创建上述其中一个类,并将其与该数据流相关联。例如:
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。(如果您正在与网络或其他系统交换数据,则需要注意字节序,但这是另一篇文章。)
流处理适用于处理大量数据。当一次性将所有数据加载到内存中不现实时,可以将其作为流打开,并处理其中的小块数据。
流(Stream)只是对一个字节流的抽象(或包装)。这个“物理”字节流被称为基础流(base stream)。因此,在创建流包装器时始终存在一个基础流,因此包装器以基础流类型命名,例如FileStream、MemoryStream等。
流包装器的优点在于,您可以获得统一的 API 与任何底层类型的流进行交互,例如USB、文件等。
为什么要将数据视为流? 因为数据块是按需加载的,我们可以将数据作为块进行检查/处理,而不是将整个数据加载到内存中。这就是大多数程序处理大型文件的方式,例如加密操作系统映像文件。
我建议您先阅读MSDN上有关流的内容: http://msdn.microsoft.com/zh-cn/library/system.io.stream.aspx
MemoryStream和FileStream分别是用于处理原始内存和文件的流...
只有一种基本类型的Stream
。但在不同的情况下,某些成员在调用时会抛出异常,因为在该上下文中操作不可用。
例如,MemoryStream
只是一种将字节移入和移出内存块的方式。因此,您可以在其上调用Read和Write。
另一方面,FileStream
允许您从/向文件读取或写入(或两者兼而有之)。是否可以实际进行读取或写入取决于打开文件的方式。如果您仅以读取访问权限打开文件,则无法对其进行写入。
我不会称它们为不同类型的流。Stream类有CanRead和CanWrite属性,告诉您特定流是否可读取和写入。
不同流类(例如MemoryStream vs FileStream)之间的主要区别在于后备存储器-从哪里读取数据或将其写入的位置。从名称上就很明显。MemoryStream仅将数据存储在内存中,FileStream由磁盘上的文件支持,NetworkStream从网络中读取数据等。
MemoryStream
通常适用于您需要处理相对较小量的数据,并且您知道内存的大小以及要加载到内存中的数据的大小。这样至少可以提高性能,因为您已经将所需数据存储在内存中,无需从磁盘访问。而当处理较大的文件时,FileStream更适合,因为可能无法将其完全加载到内存中。
Stream
),它公开一些有用的方法,如读取、写入和更改位置。现在,您可以基于它们的后备存储(FileStream、MemoryStream)创建类,这些类继承自Stream
并根据特定的后备存储构建该功能。 - The Muffin Man