当我使用文本阅读器时,什么是检测我实际上处于数据末尾的最佳方法?这样做的通常方法如下所示,
while(reader.Peek() != -1)
{
///do stuff
}
但是,msdn文档here声明以下内容
因此,我的问题是,如何确定您是否真正处于读者数据的末尾,或者读者/底层流根本不支持搜索,因为此处的返回值似乎是模棱两可的?如果例如我有以下
public void Parse(TextReader reader)
{
while(reader.Peek() != -1) //am I really at the end
{
//do stuff
}
}
Parse(new StreamReader(new NetworkStream(....)));
因为networkstream不支持搜寻。
还是我错过了什么?
编辑:
为了澄清起见,我可以使用更具体的StreamReader类轻松实现此目的,因为我可以检查EoS。但是,为了使事情更笼统,我想使用TextReader,因此我不仅仅局限于StreamReader。但是Peek的语义似乎有些奇怪,为什么它不只是在不支持查找的情况下抛出,并且为此为什么TextReader没有EoF属性?
最佳答案
这实际上取决于您在解析中正在执行的操作。
我通常只是Read
,看看读了多少。我建议不要一次读一个字符:
char[] buffer = new char[1024 * 16];
int charsRead;
while ((charsRead = read.Read(buffer, 0, buffer.Length)) > 0)
{
// Process buffer, only as far as charsRead
}
关于c# - TextReader.Peek行为并检测流/阅读器的结尾,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13650668/