4

我有一个 .txt 文件,它有 3 行,如下所示:

A50

B25

C25

这是我的代码:

FileStream fs = new FileStream(@"E:\1.txt", FileMode.Open);
StreamReader sr = new StreamReader(fs);
textBox1.AppendText(sr.ReadLine() + "\r\n");
textBox1.AppendText(fs.Position.ToString());

现在运行上述代码后,输出将是:

A50

14

我的问题是为什么位置值是 14?为什么它不是 4,因为流的指针会指向第一行 A50 末尾的 '\n' 字符?这与内部缓冲区有关吗?详细的内部缓冲区是什么以及它如何与流读取器一起工作?

抱歉英语不好。

4

2 回答 2

4

StreamReader数据从磁盘读取到内部缓冲区,然后满足来自该缓冲区的请求。

它以这种方式工作是为了减少调用操作系统获取数据的次数。如果它没有内部缓冲区,那么它必须这样做:

while (not end-of-file and character != newline)
{
    read next character and append to string
}

使用内部缓冲区,它将大量数据(默认为 4K 字节,但可以更改)读取到内存中。然后它可以快速扫描该数据块以查找换行符并返回字符串。

于 2013-05-13T18:30:12.583 回答
3

我的问题是为什么位置值是 14?

为了在底层流上执行相对较少的读取操作,它StreamReader具有“过度读取”。是的,它与内部缓冲区有关 - 想法是它将在底层流上执行“大块”读取操作,通常读取比它严格需要的更多以满足当前操作 - 从而防止大量单字节读取.

要一次读取一行而不会有过度读取的风险,它必须一次读取一个字节——甚至可能不是一个字符。根据流的实现,这很可能是低效的。相反,它读入一个隐藏的实现细节的缓冲区(您无法直接访问该缓冲区),然后满足来自该缓冲区的请求,直到它必须再次从流中读取。

于 2013-05-13T18:28:36.667 回答