C#中,关于流的几个疑惑,谢谢!
2、MemoryStream的构造方法接受的是byte[],StringReader/StringWriter的构造方法接受的是String,TextReader/TextWriter的构造方法啥都没接受(有一个重载的接受IFormatProvider)。
3、请问这几个流是不是不同于其它的流与磁盘进行数据传输,这几个类是不是用于用户和内存之间传输数据?是不是不大常用呢,书上没介绍,需不需要了解一下。
4、常用的流是不是FileStream、StreamReader、StreamWriter、BinaryReader、BinaryWriter? 展开
所谓的“流”,指的是Stream,也就是所谓的一个文件区。这个文件区中存储着的信息可以是在内存中,也可以是在硬盘中。流中的数据均以byte型数组去存储。
BufferedStream不是有缓冲区,而是本身就是缓冲区,可以用它来暂时存储其它流中的内容,然后flush进入相应的流。
至于StreamReader、StreamWriter、BinaryReader和BinaryWriter,他们都是流操作器,这些都是为了方便用户往流里写数据用的。StreamReader是标准流读取器,StreamWriter是标准流写入器,BinaryReader是二进制流读取器,BinaryWriter是二进制流写入器。标准流指的是文本文件,而二进制流指的就是二进制文件。
MemoryStream的构造函数完全可以什么都不填。当留空的时候则会产生一个空白的内存流,然后可以通过流操作器向里面写入数据。总的来说MemoryStream还算是常用,不过得看你用来干什么。如果只是单纯的文件操作,那么我可以告诉你,有用的只有FileStream。
2023-08-29 广告
BufferedStream 只是一个纯粹的内存缓冲区, 一般用来结合 File.OpenRead, File.OpenWrite 等进行操作, StreamWriter 本身有默认的(或是构造中指定大小的)缓冲区, 这两者并不冲突. 可以理解为为了简化编程, C# 结合了文件读写类和缓冲类, 产生了 StreamWriter 这样一个方便的东西给程序员用. 但不能因为 StreamWriter 中有缓冲区了就不再提供单独的 BufferedStream 给别的 Stream 用啊. 这没什么可纠结的.
TextReader/TextWriter 只是 StreamReader/StreamWriter 和 StringReader/StringWriter 的抽象基类, 不提供具体的实现. 一般来说, 对 Text 进行操作时, 不是 Stream 就是 String, 将 TextReader/TextWriter 实例化为它的子类就行了, 比如 TextReader reader = new StringReader(...);
在我个人的理解中, 程序与磁盘的 IO 操作最终都是由操作系统来处理的, 所以在 C# 中不管用什么流去读写磁盘文件, 最终都是读取或写入二进制数据, 没区别.
至于常不常用, 这个得看平常都开发什么东西啊. 如果总是开发 ASP.Net 的, 那几乎就没怎么涉及到磁盘IO. 我个人的话, BufferedStream 就没怎么用过, MemoryStream 倒是真比较常用, StringReader 至今没用过, StreamReader 经常会用到.
在没有实际需求之前, 知道每个类都是干嘛用的就可以了, 在合适的地方用合适的类和方法, 没实现需求之前不需要了解太深入, 因为东西实在太多了.
这一条基本可以参见第 3 条了, 流这东西, 说复杂也复杂, 因为一开始理解深入不太容易, 说简单也简单, 因为 C# 都已经封装地很容易对各种流进行操作了, 甚至同一种实现, 有时也可以用各种不同的流去操作.
一般来说, 如果只是对磁盘文件进行普通操作, System.IO.File 命名空间下提供了很多静态的类, 结合 FileStream 和 StreamReader/StreamWriter 就可以了, 再了解一下 MemoryStream 和 byte[] 跟一般流的结合使用, 差不多了.