了解流阅读器和内部缓冲区

本文关键字:内部 缓冲区 了解 | 更新日期: 2023-09-27 18:13:35

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

A50

B25

这件

这是我的代码:

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作为流的指针将指向''n'字符,这是在第一行的结尾A50?这与内部缓冲有关吗?什么是内部缓冲区的细节和它是如何与流阅读器工作?

对不起,我的英语不好。

了解流阅读器和内部缓冲区

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

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

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

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

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

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

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