StreamReader, C#, peek

4
我有一个StreamReader,它会不时地检查一个简单的文本文件是否还有更多内容需要读取。它使用peek属性。问题是,在我使用peek时,位置会发生改变,尽管不应该发生这种情况。
FileStream m_fsReader = new FileStream(
                        m_strDataFileName,
                        FileMode.OpenOrCreate,
                        FileAccess.Read,
                        FileShare.ReadWrite                        );

StreamReader m_SR = new StreamReader(m_fsReader);

Console.WriteLine("IfCanRead SR Position " + m_fsReader.Position +
     " and Length " + m_fsReader.Length);

if (m_SR.Peek() == -1) {
       Console.WriteLine("IfCanRead false 2 SR Position " + 
             m_fsReader.Position  + " and Length " + m_fsReader.Length);

       return false;
}
else {
       Console.WriteLine("IfCanRead true 2 SR Position " + 
           m_fsReader.Position + " and Length " + m_fsReader.Length);

       return true;
}  

请发布您相关的代码,因为Peek不会消耗任何字节。这就是Peek的目的。 - Wim
我假设你已经了解了File.ReadAllBytes和其他类似的方法,但它们不能在你特定的程序中使用... - user1228
2个回答

14
文档指出,Peek方法不会改变StreamReader对象的位置,但您正在检查基础流的当前位置,而不是读取器本身的位置。我并没有看到它保证基础流的位置保持不变。实际上,我怀疑它只是读取它并在内部进行缓冲,以使读取器的光标保持在先前的位置。这意味着它不能保证基础流的位置不变。

Peek方法不会改变StreamReader对象的当前位置。如果当前没有更多字符可用,则返回值为-1。


不,我正在检查StreamReader处理程序。 - Boris Raznikov
1
你的代码显示你打印的是流的位置,而不是流读取器。我理解你在对读取器调用Peek方法,但是你似乎认为它会使流保持在同一位置,但文档只说它不会改变读取器的位置。我会编辑你的代码以便你可以取消你错误的投票。 - tvanfosson
+1也好。你详细的回答不应该得到负分。 - Wim
+1 - 真遗憾你被踩了,其实你的回答非常准确。 - Rob Levine
我在这个网站上被其他人告知要这样做。 - Boris Raznikov
1
@Roman -- 给那些不正确的答案投反对票是完全合理的,我可以理解你可能认为我的答案不适用。这就是为什么我评论和编辑,给你一个机会撤销你的投票。没有恶意。 - tvanfosson

6

我亲自测试了这个。基础FileStream的位置已经改变,但关键点是,这并不意味着StreamReader实际上已经消耗了任何字节。所以没有问题。


3
为什么你会踩那些试图帮助你的人,我真的不明白。 - Wim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接