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

Posted

技术标签:

【中文标题】当 Stream.Read() 存在时,StreamReader 的目的是啥?【英文标题】:What is the purpose of StreamReader when Stream.Read() exists?当 Stream.Read() 存在时,StreamReader 的目的是什么? 【发布时间】:2015-02-23 06:06:14 【问题描述】:

这一直困扰着我。我知道 Stream 是一个抽象类,因此无法实例化,但它具有派生自它的类。为什么有一个 StreamReader 类和一个 Stream.Read() 方法(反之亦然 StreamWriterStream.Write() )?您可以使用 300 万种不同的方法写入文本文件,但试图了解 System.IO 命名空间中的所有这些不同类型和方法是相当令人沮丧的。我找到了有关编写器和读取器对象或派生流对象本身之间差异的问题和答案,但没有关于这种特殊情况。

【问题讨论】:

由于StreamReader是抽象的,你需要一个具体类的对象,例如TextReader,来调用Stream.Read()方法。类和方法不是多余的。 【参考方案1】:

TextReaderStreamReader 派生自)适用于字符串。 Stream 适用于字节。文本和字节之间的转换由Encoding 执行。

根据你的文件内容是文本还是二进制选择合适的类。

了解difference between text and bytes 很重要。

【讨论】:

StreamReader 适用于文本。它源自TextReaderStreamReader 包装 Stream 因为Stream 不支持基于文本的操作。当您只有Stream 时,您将如何将字符串写入文件?! 抱歉忽略我最后的评论,我看错了。如果 Stream 与字节一起工作,为什么微软在它与文本一起工作时称它为 StreamReader? FCL 有时会如此混为一谈。 他们应该叫它StreamTextReaderStreamBasedTextReader。把这个名字想象成缩写......我理解你的困惑,因为当我了解到这个时,我也有同样的话要说。不过,当您对这个概念有一些经验时,这完全是有道理的。 也许您的困惑更多在于 BCL 的设计,而不是文本和字节的分离。 BCL?你是说整箱吗?我确实理解字节并且文本只是编码字节。【参考方案2】:

StreamReaderTextReader,这意味着它是 Stream 包装器。 TextReader 会将文本数据(字符串或字符)转换(或编码)为 byte[] 并将它们写入底层Stream

查看两种实现之间的区别,您可以看到StreamReader 派生自TextReader,正如声明的那样,它处理文本而不是字节。在我看来,对于想要使用文本表示的用户来说,这是一种抽象。当然,底层实现需要Stream 来使用这些数据,但会为最终用户提供一定程度的抽象。

【讨论】:

【参考方案3】:

这两种情况用在不同的场景

当您使用流类时,您可以访问文件进行读写。但是当您使用 streamreader 类时,您可以使用它来只读。这可以防止使用要写入的文件。有时此类用于安全目的。例如对于只读的系统文件。

【讨论】:

以上是关于当 Stream.Read() 存在时,StreamReader 的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

C# - Stream.Read 偏移工作不正确

reader.ReadToEnd 和 Stream.Read 之间的区别

C# Stream.Read 超时

如果没有发送任何内容,Stream.Read不会返回任何内容

HybridAuth Facebook 登录错误:“无效范围:offline_access、publish_stream、read_friendlists”

Py4JJavaError:调用 o45.load 时出错。 :java.lang.NoClassDefFoundError:org/apache/spark/sql/sources/v2/Strea