C#使用流

时间:2009-09-10 09:40:01

标签: c# stream

流对我来说有点神秘。我不知道何时使用哪个流以及如何使用它们。有人可以向我解释如何使用流吗?

如果我理解正确,有三种流类型:

  • stream
  • read stream
  • write stream

这是对的吗?例如,MemorystreamFileStream之间有什么区别?

7 个答案:

答案 0 :(得分:64)

是用于传输数据的对象。有一个通用流类 System.IO.Stream ,从中派生出.NET中的所有其他流类。 Stream类处理字节。

具体的流类用于处理除字节之外的其他类型的数据。例如:

  • 当外部源是文件
  • 时使用FileStream
  • MemoryStream用于在内存中存储数据
  • System.Net.Sockets.NetworkStream处理网络数据

StreamReaderStreamWriter等读取器/写入器流不是流 - 它们不是从System.IO.Stream派生的,它们旨在帮助写入和读取数据流!

答案 1 :(得分:49)

在这里扩展一些其他答案,并帮助解释很多你会看到的示例代码,大多数时候你不直接读取和写入流。流是一种传输数据的低级方法。

您会注意到读写功能都是以字节为导向的,例如: WriteByte()。没有用于处理整数,字符串等的函数。这使得流非常通用,但是如果你只是想传输文本那么简单易用。

但是,.NET提供了在本机类型和低级流接口之间进行转换的类,并为您传输数据到流中或从流中传输数据。一些值得注意的类是:

StreamWriter // Badly named. Should be TextWriter.
StreamReader // Badly named. Should be TextReader.
BinaryWriter
BinaryReader

要使用这些,首先获取流,然后创建上述类之一并将其与流关联。 E.g。

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。 (如果您与网络或其他系统交换数据,则需要注意endianness,但这是另一篇文章。)

答案 2 :(得分:20)

Streams适合处理大量数据。如果同时将所有数据加载到内存中是不切实际的,您可以将其作为流打开并使用它的一小部分。

答案 3 :(得分:5)

Stream只是physical字节流的抽象(或包装器)。此physical流称为base stream。因此总是有一个基本流,在其上创建流包装器,因此包装器以基本流类型命名,即FileStreamMemoryStream等。

流包装器的优点是您可以获得统一的api来与任何基础类型usb, file等的流进行交互。

为什么要将数据视为流 - 因为数据块是按需加载的,我们可以将数据作为块检查/处理,而不是将整个数据加载到记忆。这就是大多数程序处理大文件的方式,例如加密OS映像文件。

答案 4 :(得分:4)

Stream只有一种基本类型。但是在各种情况下,某些成员在调用时会抛出异常,因为在该上下文中操作不可用。

例如, MemoryStream 只是一种将字节移入和移出一块内存的方法。因此,您可以在其上调用Read和Write。

另一方面, FileStream 允许您从/向文件读取或写入(或两者)。您是否可以实际读取或写入取决于文件的打开方式。如果只打开文件进行读访问,则无法写入文件。

答案 5 :(得分:3)

我首先要阅读MSDN上的流: http://msdn.microsoft.com/en-us/library/system.io.stream.aspx

Memorystream和FileStream是分别用于处理原始内存和文件的流...

答案 6 :(得分:1)

我不会称那些不同的流。 Stream类具有CanRead和CanWrite属性,可以告诉您是否可以读取和写入特定的流。

不同流类(例如MemoryStream与FileStream)之间的主要区别是后备存储 - 从中​​读取数据或将数据写入的位置。这个名字显而易见。 MemoryStream仅将数据存储在内存中,FileStream由磁盘上的文件支持,NetworkStream从网络读取数据等等。