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;
}  
4

2 回答 2

13

文档表明 StreamReader 的位置没有改变,但是您正在检查底层流的当前位置,而不是阅读器本身的位置。我认为它不能保证底层流的位置保持不变。事实上,我怀疑它只是简单地读取它并在内部缓冲以将读者的光标保持在前一个位置。这意味着它不能保证底层流的位置不变。

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

于 2009-11-15T14:22:38.283 回答
6

我自己对此进行了测试。底层 FileStream 的位置发生了变化,但关键是,这并不意味着 StreamReader 实际上已经消耗了任何字节。所以没有问题。

于 2009-11-15T14:17:21.307 回答