如果我理解正确,有三种流类型:
stream
read stream
write stream
这是对的吗?例如,Memorystream
和FileStream
之间有什么区别?
答案 0 :(得分:64)
流是用于传输数据的对象。有一个通用流类 System.IO.Stream
,从中派生出.NET中的所有其他流类。 Stream
类处理字节。
具体的流类用于处理除字节之外的其他类型的数据。例如:
FileStream
类
MemoryStream
用于在内存中存储数据System.Net.Sockets.NetworkStream
处理网络数据 StreamReader
和StreamWriter
等读取器/写入器流不是流 - 它们不是从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
。因此总是有一个基本流,在其上创建流包装器,因此包装器以基本流类型命名,即FileStream
,MemoryStream
等。
流包装器的优点是您可以获得统一的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从网络读取数据等等。