当Stream.Read()存在时,StreamReader的目的是什么?

15

这一直困扰着我。我知道 Stream 是一个抽象类,因此无法被实例化,但它有从中派生的类。为什么会有一个 StreamReader 类和一个 Stream.Read() 方法(对于 StreamWriterStream.Write() 则反过来)?你可以使用三百万种不同的方法写入文本文件,让人感到沮丧,试图理解 System.IO 命名空间中的所有这些不同类型和方法。我找到了关于 writer 和 reader 对象之间或派生的流对象本身之间差异的问题和答案,但没有关于这个特定情况的信息。


由于 StreamReader 是一个抽象类,你需要一个具体类的对象,例如 TextReader,才能调用 Stream.Read() 方法。这个类和这个方法并不是多余的。 - Jim Balter
3个回答

15

TextReader(派生自StreamReader)用于处理字符串,而Stream用于处理字节。文本和字节之间的转换由Encoding执行。

基于文件内容是文本还是二进制,选择正确的类很重要。

了解文本和字节之间的区别非常重要。


StreamReader 用于文本处理,是从 TextReader 派生而来的。StreamReader 包装 了一个 Stream,因为 Stream 不支持基于文本的操作。当你只有一个 Stream 时,你该如何将一个字符串写入文件呢?! - usr
1
抱歉,忽略我的上一条评论,我看错了。如果一个流(Stream)使用的是字节(byte),为什么微软会称其为StreamReader,而它又是用于文本的呢?FCL有时候可以这么混淆人。 - Bagofsheep
1
他们本应该称其为“StreamTextReader”或“StreamBasedTextReader”。把这个名字看作是缩写...我理解你的困惑,因为我学习时也有同样的感受。然而,当你对这个概念有一些经验时,它完全是有意义的。 - usr
也许你的困惑更多地与BCL的设计有关,而不是文本和字节的分离。 - usr
BCL?你是指FCL吗?我确实理解字节,那段文本只是编码后的字节。 - Bagofsheep

2
一个 StreamReader 是一个 TextReader,这意味着它是一个 Stream 的包装器。一个 TextReader 将会把文本数据(字符串或字符)转换(或编码)为 byte[] 并将其写入底层的 Stream
通过比较两种实现,可以看到 StreamReader 是从 TextReader 派生而来的,它作为声明,处理的是文本而不是字节。对于想要使用文本表示的用户来说,它似乎是一个抽象。当然,底层的实现需要一个 Stream 来消耗这样的数据,但会为最终用户提供一定程度的抽象。

1
这两种情况用于不同的场景。
当您使用流类时,可以访问文件以进行读写。但是,当您使用StreamReader类时,只能用它来进行读取。这可以防止文件被写入。有时候,此类用于安全目的,例如只读系统文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接