【问题标题】:StreamReader and buffer in C#C# 中的 StreamReader 和缓冲区
【发布时间】:2010-06-30 09:53:04
【问题描述】:

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

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

根据weblog ,StreamReader 的内部缓冲区大小为2k,因此我可以使用Read() 有效地读取一些kbs 的文件,避免Read(Char[], Int32, Int32)

此外,即使文件很大,我也可以构造 StreamReader,为 buffer 传递大小

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

【问题讨论】:

    标签: c# streaming buffer streamreader buffering


    【解决方案1】:

    查看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[]) 多得多,而且由于它是一个虚拟方法,调用本身会减慢它的速度。

    【讨论】:

      【解决方案2】:

      我认为这个问题在 stackoverflow 上已经以某种方式提出了不同的问题:How to write the content of one stream into another stream in .net?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-23
        • 2013-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多