微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – TextReader.Peek行为和检测流/阅读器的结束

当我使用文本阅读器时,检测到我实际上在数据末尾的最佳方法是什么?通常的方法是执行此操作,如下所示,
while(reader.Peek() != -1)
    {
       ///do stuff
    }

但是,msdn文档here说明了以下内容

An integer representing the next character to be read,or -1 if no more characters are available or the reader does not support seeking.

所以我的问题是你怎么知道你是否真的在读者数据的末尾,或者读者/底层流不支持寻求,因为这里的返回值似乎含糊不清?如果我有以下内容

public void Parse(TextReader reader)
    {
         while(reader.Peek() != -1) //am I really at the end
         {
            //do stuff
         }
    }

    Parse(new StreamReader(new NetworkStream(....)));

因为网络流不支持寻求.

还是我错过了什么?

编辑:

为了澄清,我可以使用更具体的StreamReader类轻松实现这一点,因为我可以检查EoS.但是为了保持一般性,我想使用TextReader,所以我不仅仅与StreamReader绑定.然而,Peek的语义似乎有点奇怪,为什么它不仅仅是在寻求不支持的情况下抛出,为此为什么没有TextReader的EoF属性

解决方法

这实际上取决于你在解析中所做的事情.

我通常会阅读,看看有多少阅读.我建议不要一次读一个角色:

char[] buffer = new char[1024 * 16];
int charsRead;
while ((charsRead = read.Read(buffer,buffer.Length)) > 0)
{
    // Process buffer,only as far as charsRead
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐