2010-06-30 55 views
8

我有一個關於StreamReader緩衝區使用情況的問題。 這裏:http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx你可以看到:StreamReader和C#中的緩衝區

「從流中讀取數據時,它是更有效使用的緩衝區的大小與流的內部緩衝區相同的。」

根據該weblog,一個StreamReader的內部緩衝器大小爲2K,所以可高效地讀取使用Read()避免Read(Char[], Int32, Int32)一些KBS的一個文件。

而且,即使一個文件是大我可以構造的StreamReader傳遞一個大小爲buffer

那麼,什麼是一個外部緩衝器的需求?

回答

1

我認爲這個問題已經被問莫名其妙不同的計算器:How to write the content of one stream into another stream in .net?

「當使用Read方法,它是更有效使用的緩衝區的大小與流的內部緩衝區,其中相同內部緩衝區設置爲你想要的塊大小,並總是讀取小於塊大小。如果內部緩衝區的大小在流構造時未指定,則其默認大小爲4千字節(4096字節)。

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[])和因爲它是一種虛擬方法,所以這些調用本身會減慢速度。