面试题答案
一键面试- 减少系统调用次数:
- 在Java BIO中,直接使用底层的
InputStream
和OutputStream
进行读写操作时,每次读写往往都会触发系统调用。系统调用涉及用户态和内核态的切换,这种切换开销较大。 - 而
BufferedInputStream
和BufferedOutputStream
内部维护了一个缓冲区数组。例如,BufferedInputStream
在读取数据时,会一次性从底层输入流中读取较大的数据块到缓冲区中(默认缓冲区大小为8192字节)。后续的读操作首先从缓冲区中获取数据,只有当缓冲区数据读完时,才会再次触发底层输入流的读取操作,即系统调用。这大大减少了系统调用的次数,从而提高了数据传输效率。
- 在Java BIO中,直接使用底层的
- 数据预读和缓存:
BufferedInputStream
在读取数据时,除了满足当前应用程序的读取请求外,还会提前从底层输入流中读取一部分数据到缓冲区。这样当下次应用程序请求数据时,如果所需数据在缓冲区中,就可以直接从缓冲区获取,而不需要再次从底层设备(如磁盘、网络等)读取,加快了数据获取速度。- 对于
BufferedOutputStream
,它会将应用程序要输出的数据先缓存到缓冲区中。当缓冲区满或者调用flush
方法时,才会将缓冲区中的数据一次性写入到底层输出流。这避免了每次小数据量输出都进行系统调用,提高了输出效率。