【问题标题】:Access TextReader as a Stream将 TextReader 作为流访问
【发布时间】:2012-11-05 23:11:15
【问题描述】:

我希望 TextReader 具有与 Stream 类似的功能。特别是在流中设置位置的能力。有没有办法将 TextReader 变成流?

我想接受 TextReader,但像 Stream 一样访问它。

【问题讨论】:

    标签: c# .net stream


    【解决方案1】:

    您可以通过使用 StreamReader 类来获取 Stream。 StreamReader 是 TextReader 的子类,因此您可以通过执行以下操作轻松访问其流属性:

        TextReader reader = File.OpenText("C:\\todo.txt");
        Stream stream = ((StreamReader)reader).BaseStream;
    

    根据您的需要,您也可以只使用 StreamReader 类。

    来源:http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx

    希望这会有所帮助!

    【讨论】:

    • 假设您的 todo.txt 包含单个字符 ş(UTF8 格式为 239,187)。如果您将位置设置为 1 并尝试读取一个字符,您将得到垃圾。
    • 虽然这适用于 File.OpenText(...) 返回的底层 StreamReader 类,但它不适用于所有 TextReader 对象,例如 StringReader。我遇到的问题是我想允许流到内存或磁盘中的任何类型的文本类型对象。
    • 正确 - 您需要在最初获得 TextReader 的位置打开底层流。
    【解决方案2】:

    在一般情况下您不能这样做。并非所有TextReader 实例都基于流。

    另外,TextReader 基于文本行,其中行终止符可能不是您可以备份的那种。

    【讨论】:

    • 我明白了,看来我必须限制对 Stream 的使用。谢谢,我有一种感觉就是这种情况。
    • 您在处理 Unicode 或其他非单字节字符集的字符集吗?如果是这样,那么您将无法以简单的方式做到这一点。
    • 我打算添加参数,以便可以指定编码。我的主要目的是能够获取 Stream 并索引流中的行。当然,我必须检查编码类型才能知道它是包含单字节字符还是两字节字符。
    • 或“任意字节”字符。只需让编码将其分成几行。也许用TextReader.ReadLine读取,使用Encoding.GetBytes根据指定的编码从字符串中获取字节,然后将字节添加到MemoryStream,记录索引,然后可能添加一个“新行”。
    • 对于转换(不可访问),您可以使用:string content = textReader.ReadToEnd();流流 = new MemoryStream(Encoding.UTF8.GetBytes(content));
    【解决方案3】:

    像 StreamReader。

    StreamReader Class

    关于编码

    StreamReader Constructor (String, Encoding)

    关于流

    StreamReader Constructor (Stream)

    如果您需要将其作为 TextReader 接受,那么您将受到限制。
    您真的仅限于 TextReader 作为输入吗?
    在评论中,您声明任何类型的文本。

    【讨论】:

      猜你喜欢
      • 2011-07-17
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 2016-05-25
      相关资源
      最近更新 更多