为何StreamReader需设置缓冲区?设为5后调用5次Read是否清空?
关于StreamReader缓冲区大小的疑问
问题说明
我创建了一个指定缓冲区大小为5的StreamReader,代码如下:
new StreamReader(new FileStream("C:/Users/User/Desktop/Testing/RedirectIn.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None, 128, FileOptions.None), Encoding.UTF8, true, 5, false)
我理解StreamWriter设置缓冲区的意义,但搞不懂StreamReader为什么要设置缓冲区大小。同时我猜测,把缓冲区设为5后,调用5次Console.In.Read()就能清空缓冲区,想问这个猜测对不对?
解答
StreamReader设置缓冲区的作用
StreamReader的缓冲区核心作用是减少底层IO操作的次数,提升读取效率。直接从文件这类底层流读取数据的开销比较大,所以StreamReader会一次性把指定大小的字节读到内存缓冲区里,后续调用Read()时直接从内存缓冲区取数据,等缓冲区里的数据被读完,再去底层流读取下一批数据。这和StreamWriter的缓冲区逻辑本质类似,一个是做读缓存,一个是做写缓存。
关于5次Read()清空缓冲区的猜测
这个猜测不一定准确,得结合文件内容的编码和字符类型来看:
- 如果文件里都是英文、数字这类UTF8单字节字符,那5字节的缓冲区刚好能装5个字符,这时候调用5次
Read()确实会把缓冲区里的字符全部读完,缓冲区就空了。 - 但如果是中文这类UTF8多字节字符(一个中文占3字节),5字节的缓冲区最多只能装1个中文+2个单字节字符,这时候调用3次
Read()就会把缓冲区清空,剩下的字节不够组成一个完整字符,StreamReader会自动去底层流读取新的数据补充缓冲区。 - 另外,如果文件本身的字符总数不到5个,那读几次到文件末尾后,缓冲区自然也空了,根本用不到5次
Read()。
内容的提问来源于stack exchange,提问作者Eric Movsessian
相关产品推荐
相关产品推荐

