流.寻求行为

本文关键字: | 更新日期: 2023-09-27 18:17:52

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

我有下面的代码,它将文件流的内部位置设置为一个位置,以便我可以从该位置读取行数。这与其他帖子类似,但当我使用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,我的结果将是你好,我的名字是bob然而,当我将startPosition设置为1时,我不得到你好,我的名字是bob,而是@@你好,我的名字是bob其中@@是从编码位的2个字节。

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

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

也我怎么知道有多少额外的字节是在文件的开始没有读取它(但知道编码)?

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

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

流.寻求行为

对代码进行单元测试

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

相关文章:
  • 没有找到相关文章