为什么在FileStream ctor中设置bufferSize,如果我们稍后在读取时设置它?

时间:2017-04-05 21:14:11

标签: c# .net

FileStream Constructor的文档未提及原因。它只是说:

  

BUFFERSIZE

     

输入:System.Int32

     

大于0的正Int32值表示缓冲区大小。默认缓冲区大小为4096。

但是后来我们使用Read之类的方法来指定缓冲区大小并提供缓冲区本身。

那么为什么要在构造函数中指定缓冲区大小?

1 个答案:

答案 0 :(得分:3)

这些是不同的缓冲区。一个是FileStream本身的内部缓冲区(传递给构造函数的大小),另一个是调用者的缓冲区(来自Read的缓冲区)。他们没有关系。

假设您将4000作为内部缓冲区大小传递给构造函数,然后调用:

Read(buffer, 0, 100);

将会发生什么(以简化的方式,并假设首先从此流中读取)FileStream将从文件中读取4000个字节并将其存储在其内部缓冲区中。然后它将100个字节写入调用者的缓冲区。

如果你这样做

Read(buffer, 0, 8000)

它将从文件读取4000到内部缓冲区,将4000写入调用者的缓冲区然后再次读取并从文件读取到内部缓冲区,然后完成写入调用者的一个。

为什么要有内部缓冲区?因为每次小读取都会给文件系统带来麻烦。假设您逐字节读取FileStream,4000次。它只会打扰文件系统一次,其余的3999将从内部缓冲区返回。