簡體   English   中英

C#中的StreamReader和緩沖區

[英]StreamReader and buffer in C#

我對StreamReader的緩沖區使用有疑問。 在這里: http : //msdn.microsoft.com/zh-cn/library/system.io.streamreader.aspx,您可以看到:

“從流中讀取時,使用與流的內部緩沖區大小相同的緩沖區會更有效。”

根據此博客 ,StreamReader的內部緩沖區大小為2k,因此我可以使用Read()避免Read(Char[], Int32, Int32)有效地讀取一些kbs的文件。

而且,即使文件很大,我也可以構造StreamReader並傳遞緩沖區的大小

那么,需要外部緩沖區嗎?

查看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(char[])調用Read()多次,並且由於它是一個虛擬方法,因此調用本身會使速度變慢。

我認為這個問題已經在stackoverflow上有所不同: 如何將一個流的內容寫入.net中的另一個流?

“使用Read方法時,使用與流內部緩沖區大小相同的緩沖區效率更高,其中內部緩沖區設置為所需的塊大小,並且始終讀取小於該塊大小的緩沖區。如果在構造流時未指定內部緩沖區的大小,則其默認大小為4 KB(4096字節)。”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM