[英]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.