【问题标题】:Why StreamReader returns string instead of byte array为什么 StreamReader 返回字符串而不是字节数组
【发布时间】:2017-03-29 03:47:30
【问题描述】:

两个相关问题:

  1. 为什么他们选择从StreamReader.ReadToEnd()返回string而不是byte[]
  2. 我知道我可以使用System.Text.Encoding 对其进行转换,但我应该使用哪种编码? UTF8、UTF7、ASCII 还是 Unicode?我正在处理二进制文件。

注意:我被要求澄清。只是 stream 这个词给人一种字节级的印象......嗯......stream 数据(想想网络流,文件流,缓冲区,没有它们应该是一个字符类型的概念)。正如 Joel 在他的回答中正确指出的那样,这更像是一个命名问题。

【问题讨论】:

  • 非常不清楚你为什么建议 TextReader 不应该返回字符串。欢迎对问题进行一些推理。
  • @AlexeiLevenkov:添加了更多说明。

标签: c# .net character-encoding stream


【解决方案1】:

“为什么”问题对于 Stack Overflow 来说很少是好的素材,因为唯一能真正回答这些问题的是产品设计委员会的那些人。

但是,在这种情况下,我们至少可以通过将您指向 StreamReader documentation 来为您提供一个很好的指示,您可以在其中找到:

实现一个 TextReader,以特定编码从字节流中读取字符。

因此,我们看到,处理文本而不是字节是 StreamReader 的全部内容。也许你会问为什么它被命名为“StreamReader”而不是“TextStreamReader”,但是我不得不让你回到我的第一句话。

至于获取字节数组...这取决于您想要做什么。 .Net 使用Unicode 作为字符串,但底层流可能有所不同,无论您打算如何处理这些数据,都可能需要完全不同的编码。

不过,在这种情况下,您有二进制文件,并且需要Byte[]。与其完全搞乱流,不如看看File.ReadAllBytes()。如果您必须处理流,您可能还需要BinaryReader

【讨论】:

  • 嗯...有见地。我不能使用ReadAllBytes,因为我必须从特定的偏移量读取,但BinaryReader 是一个很好的替代方案。只是名字本身有点误导。
  • @dotNET 是的,我们只针对名称进行编程。但是,文档的每个部分都可能很有价值。有时,它是名称空间,有时是程序集,有时甚至是注释都包含关键信息。在这种情况下,它是继承层次结构。
【解决方案2】:

您有许多 StreamReader 的替代品,它主要用于读取字符数据。如果您正在读取二进制文件数据,那么更好的选择是使用FileStream.Read。它以字节数组的形式返回数据。

根据我的基准测试,它比BinaryReaderFile.ReadAllBytes 快。但是,File.ReadAllBytes 更容易使用。

【讨论】:

    猜你喜欢
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2019-12-21
    • 2017-04-05
    • 2011-09-20
    • 1970-01-01
    相关资源
    最近更新 更多