C#使用流

Mar*_*ijn 107 c# stream

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

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

  • stream
  • read stream
  • write stream

它是否正确?并且,例如,a Memorystream和a 之间的区别是FileStream什么?

Ars*_*yan 73

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

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

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

读取器/写入器流如同流StreamReaderStreamWriter不是流 - 它们不是源自System.IO.Stream它们,它们旨在帮助写入和读取数据流!

  • 不,Stream不是数据容器,它用于传输数据,例如FileStream将数据从byte []传输到phisical文件,NetworkStream通过socket传输byte [].Reader Writer类是从流中写入和读取的辅助类,例如StreamReader可用于从Stream字符串读取而不是byte [].如果您将FileStream作为参数,它将从File读取,如果是来自socket的NetworkStream. (9认同)
  • 因此,如果我理解正确,流包含数据,并且不对它做任何事情.读者和作者的"助手"类可以处理(操纵)流中的数据? (3认同)
  • @ user420667。好问题。在AudioStream和TemperatureStream情况下,它们最有可能是与设备关联的驱动程序的BinaryStreams。或者,您可以创建一个专门为接口构建的CustomStream。 (2认同)

Tim*_*ams 53

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

您会注意到读取和写入的函数都是面向字节的,例如WriteByte().没有用于处理整数,字符串等的函数.这使得流非常通用,但是如果您只是想传输文本,则不太简单.

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

StreamWriter // Badly named. Should be TextWriter.
StreamReader // Badly named. Should be TextReader.
BinaryWriter
BinaryReader
Run Code Online (Sandbox Code Playgroud)

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

MemoryStream memoryStream = new MemoryStream();
StreamWriter myStreamWriter = new StreamWriter(memoryStream);
Run Code Online (Sandbox Code Playgroud)

StreamReader和StreamWriter在本机类型及其字符串表示之间进行转换,然后将字符串作为字节传输到流中或从流中传输.所以

myStreamWriter.Write(123);
Run Code Online (Sandbox Code Playgroud)

将"123"(三个字符'1','2'然后'3')写入流.如果您正在处理文本文件(例如html),StreamReader和StreamWriter就是您要使用的类.

myBinaryWriter.Write(123);
Run Code Online (Sandbox Code Playgroud)

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


mea*_*est 21

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

  • 很想看看你刚才说的“用它的一小部分工作”的例子。 (4认同)
  • 流也适用于少量数据.如果C#程序员想要操纵文件的内容,他/她必须使用流,而不管数据量.对于网络流也是如此.当然,如果程序员编写的是像C这样的低级语言,则可以将字符或字节直接写入磁盘或插槽,但即使对于少量数据,也很耗时且更容易错误. (2认同)

Anw*_*ain 8

Stream只是physical字节流上的抽象(或包装器).这个physical流称为base stream.所以总是有在其上流封包被创建并基本流类型之后即由此所述包装被命名为基本流FileStream,MemoryStream

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

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


Rob*_*ban 5

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

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