流.寻求行为
本文关键字: | 更新日期: 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
前两个字节表示文件的编码。请看这篇文章