MST

星途 面试题库

面试题:Java中缓冲流提升IO读写效率原理相关 - 缓冲流内部机制

请简述Java中缓冲流(BufferedInputStream和BufferedOutputStream)是如何通过内部机制来提升IO读写效率的?
22.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. BufferedInputStream
    • 内部缓存数组:BufferedInputStream内部维护了一个字节数组作为缓冲区(默认大小为8192字节)。当从输入流读取数据时,它并不是每次都从底层输入流读取单个字节,而是一次性从底层输入流读取多个字节(尽量填满缓冲区)到这个内部数组中。
    • 数据读取机制:当调用read()方法读取一个字节时,它首先从缓冲区数组中读取数据。如果缓冲区中还有未读取的数据,就直接返回缓冲区中的字节,这样避免了每次读取都与底层输入流交互,减少了系统调用开销。只有当缓冲区中的数据读完后,才会再次从底层输入流读取数据填充缓冲区。
    • read(byte[] b)方法:对于read(byte[] b)方法,同样先从缓冲区中读取数据填充到参数数组b中。如果缓冲区中的数据不足以填满b数组,会先将缓冲区中剩余的数据复制到b数组,然后从底层输入流读取数据填充缓冲区,再从缓冲区中读取数据继续填充b数组,直到b数组被填满或者底层输入流无数据可读。
  2. BufferedOutputStream
    • 内部缓存数组:BufferedOutputStream也有一个内部字节数组缓冲区(默认大小为8192字节)。当调用write()方法写入数据时,数据首先被写入到这个缓冲区中,而不是直接写入到底层输出流。
    • 数据写入机制:当缓冲区被填满(或者调用flush()方法,或者关闭流时),BufferedOutputStream会将缓冲区中的所有数据一次性写入到底层输出流。这样减少了对底层输出流的写入次数,因为底层输出流的写入操作通常是比较耗时的系统调用,批量写入可以显著提升效率。例如,多次调用write(int b)方法写入单个字节,这些字节会先在缓冲区累积,直到缓冲区满了才一次性写入到底层输出流。

通过上述内部机制,BufferedInputStream和BufferedOutputStream减少了与底层输入输出设备的交互次数,从而提升了IO读写效率。