Stream.Seek行为

时间:2011-12-14 05:16:42

标签: c# .net stream

我今天早些时候遇到这个,不知道为什么会这样。

我有以下代码将文件流的内部位置设置为一个位置,以便我可以读取该位置的行数。它与this other post类似,但当我使用stream.Seek时,我看到了奇怪的结果

StringBuilder b = new StringBuilder();
using(var stream = _streamFactory.CreateStream())
using (var streamReader = new System.IO.StreamReader(stream, _streamFactory.Encoding))
{
     stream.Seek(startPosition, System.IO.SeekOrigin.Begin);

     string value;
     for (int i = 0; i < lines; i++)
     {
         if ((value = streamReader.ReadLine()) != null)
         {
             b.AppendLine(value);
         }
      }
 }

现在我正在做的是使用UTF-8编码读取文件,所以我知道在文件的开头有额外的位表示这个但不是我要提取的文本的一部分。

比如说我在文件中有以下文字

Hello my name is bob

因此,如果我将startPosition设置为0,我的结果将是 Hello我的名字是bob 但是当我将startPosition设置为1时,我不会得到 ello我的名字是bob 而是 @@ Hello我的名字是bob 其中@@是编码位的2个字节。

所以我的问题是为什么当我设置.Seek(0)然后执行ReadLine我得到正确的行但Seek(1)将返回编码的第2和第3个字节?

Seek(3)也会产生与Seek(0)相同的结果。如果这是一致的,我会认为Seek(0)会返回 @@@你好我的名字是bob

另外,我怎么知道文件开头没有读取多少额外字节(但知道编码)?

我试着查看反汇编的代码,不得不在我的大脑罢工之前停下来。

注意:的 在这种情况下,Streambuilder只是创建一个FileStream。我这样做,所以我可以使用MemoryStream

对此代码进行单元测试

1 个答案:

答案 0 :(得分:1)

前两个字节表示文件的编码。请查看this文章。