FileStream Constructor的文档未提及原因。它只是说:
BUFFERSIZE
输入:System.Int32
大于0的正Int32值表示缓冲区大小。默认缓冲区大小为4096。
但是后来我们使用Read之类的方法来指定缓冲区大小并提供缓冲区本身。
那么为什么要在构造函数中指定缓冲区大小?
答案 0 :(得分:3)
这些是不同的缓冲区。一个是FileStream
本身的内部缓冲区(传递给构造函数的大小),另一个是调用者的缓冲区(来自Read
的缓冲区)。他们没有关系。
假设您将4000作为内部缓冲区大小传递给构造函数,然后调用:
Read(buffer, 0, 100);
将会发生什么(以简化的方式,并假设首先从此流中读取)FileStream
将从文件中读取4000个字节并将其存储在其内部缓冲区中。然后它将100个字节写入调用者的缓冲区。
如果你这样做
Read(buffer, 0, 8000)
它将从文件读取4000到内部缓冲区,将4000写入调用者的缓冲区然后再次读取并从文件读取到内部缓冲区,然后完成写入调用者的一个。
为什么要有内部缓冲区?因为每次小读取都会给文件系统带来麻烦。假设您逐字节读取FileStream
,4000次。它只会打扰文件系统一次,其余的3999将从内部缓冲区返回。