8

我对 StreamReader 的缓冲区使用有疑问。在这里: http: //msdn.microsoft.com/en-us/library/system.io.streamreader.aspx你可以看到:

“从流中读取时,使用与流的内部缓冲区大小相同的缓冲区更有效。”。

根据此博客,StreamReader 的内部缓冲区大小为 2k,因此我可以使用Read()避免Read(Char[], Int32, Int32).

此外,即使文件很大,我也可以构造 StreamReader 传递缓冲区的大小

那么外部缓冲区需要什么?

4

2 回答 2

4

查看方法的实现StreamReader.Read,您可以看到它们都调用了内部ReadBuffer方法。

Read()方法首先读入内部缓冲区,然后一个接一个地在缓冲区上前进。

public override int Read()
{
    if ((this.charPos == this.charLen) && (this.ReadBuffer() == 0))
    {
        return -1;
    }
    int num = this.charBuffer[this.charPos];
    this.charPos++;
    return num;
}

Read(char[]...)也调用了ReadBuffer,而是调用了调用者提供的外部缓冲区:

public override int Read([In, Out] char[] buffer, int index, int count)
{
    while (count > 0)
    {
        ...
        num2 = this.ReadBuffer(buffer, index + num, count, out readToUserBuffer);
        ...
        count -= num2;
    }
}

所以我想唯一的性能损失是你需要调用Read()比它更多的次数Read(char[]),因为它是一个虚拟方法,调用本身会减慢它。

于 2010-06-30T10:46:22.933 回答
1

我认为这个问题在stackoverflow上已经以某种方式提出了不同的问题:如何将一个流的内容写入.net中的另一个流?

“使用 Read 方法时,使用与流的内部缓冲区大小相同的缓冲区更有效,其中内部缓冲区设置为所需的块大小,并且始终读取小于块大小。如果在构造流时未指定内部缓冲区的大小,则其默认大小为 4 KB(4096 字节)。”

于 2010-06-30T10:15:41.720 回答