C#使用stream

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

如果我理解正确,有三种streamtypes:

  • stream
  • read stream
  • write stream

它是否正确? 而且,例如, MemorystreamFileStream什么区别?

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

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

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

StreamReaderStreamWriter等阅读器/写入器stream不是stream – 它们不是从System.IO.Stream派生的,它们被devise用来帮助写入和读取数据和传输数据。

在这里扩展一些其他的答案,并帮助解释很多你会看到的代码示例,大部分时间你不直接读写stream。 stream是传输数据的低级手段。

你会注意到读写function都是字节定位的,例如WriteByte()。 没有处理整数,string等的函数。这使得这个stream非常通用,但是如果你只是想传输文本就不那么简单。

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

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

要使用这些,首先获取stream,然后创build上述类中的一个,并将其与stream相关联。 例如

 MemoryStream memoryStream = new MemoryStream(); StreamWriter myStreamWriter = new StreamWriter(memoryStream); 

StreamReader和StreamWriter在本机types和它们的string表示之间进行转换,然后以字节的forms将string传入或传出。 所以

 myStreamWriter.Write(123); 

将写入“123”(三个字符'1','2',然后'3')到stream中。 如果你正在处理文本文件(如html),StreamReader和StreamWriter是你将要使用的类。

 myBinaryWriter.Write(123); 

将写入代表32位整数值123(0x7B,0x00,0x00,0x00)的四个字节。 如果你正在处理二进制文件或networking协议BinaryReader和BinaryWriter是你可能使用的。 (如果你正在与networking或其他系统交换数据,你需要注意字节顺序 ,但这是另一篇文章。)

stream处理大量的数据是很好的。 如果将所有数据同时加载到内存中是不切实际的,则可以将其作为stream打开并使用小块进行处理。

Stream只有一种基本types。 但是,在各种情况下,有些成员在被调用时会抛出exception,因为在这种情况下操作不可用。

例如一个MemoryStream只是将字节移入和移出一块内存的一种方式。 因此你可以调用Read和Write。

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

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

Memorystream和FileStream是分别用于原始内存和文件的stream…

stream只是一个physical字节stream的抽象(或包装)。 这个physicalstream被称为base stream 。 所以总是有一个基础stream在其上创build一个stream包装器,因此包装器是以基本streamtypes即FileStreamMemoryStream等命名的。

stream包装的优点是你得到一个统一的API与任何基础types的usb, filestreamusb, file

为什么要将数据视为stream – 因为数据块是按需加载的,所以我们可以将数据视为块来处理,而不是将整个数据加载到内存中。 这就是大多数程序处理大文件的原因,例如encryption操作系统映像文件。

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

不同的stream类(如MemoryStream vs FileStream)之间的主要区别是后备存储 – 数据从哪里读取或从哪里写入。 这个名字很明显。 MemoryStream仅将数据存储在内存中,FileStream由磁盘上的文件支持,NetworkStream从networking中读取数据等等。

在大多数情况下,你既可以读写stream,也可以声明一个内存stream,这样你就可以使用内存中的数据,文件stream是指向一个文件的stream,所以当你写或读形成一个文件stream然后你正在读/写文件。