我们都知道输出时如果不去flush,数据会暂存在buffer里不会真正地输出。那么输入呢?输入显然不需要我们去关心太多,我们只需要读就行了。buffer对于使用者是透明的,但是通过查看源码可以得知它是怎么操作的。
(详细的代码分析先不做)
简单的讲,通过一个private static int DEFAULT_BUFFER_SIZE = 8192; 默认为8192长度的buffer(创建BufferedInputStream实例时可以指定Buffer大小),和一个fill()方法,来实现一次性读取一堆数据并保存在buffer里。
fill()方法的作用就是预读一段输入,将其存在buffer里。当我们调用read时,假如buffer里还有我们没读过的数据,就会先读buffer。假如buffer里的数据不够我们这次要读的总数,那么就会调用fill(),从流里再预读一段数据进buffer,再从buffer里去读,重复这个过程直到满足这次要读的总数为止。
假如我们要读取的数据长度很长(超过buffer大小),那么就会不走buffer直接去流里面读相应长度的数据,然后再fill一次。
这么做其实就是相当于用空间换时间:内存操作的速度通常都要比I/O(比如读写硬盘)要高速很多很多,通过预读一段数据进内存可以在读取非常频繁的情况下大大增加系统运行的速度。读取越频繁、缓冲区定义的越大,速度提升越明显。当然,如果缓冲区太大的话当心内存不够用(一般不太会出现这种情况)。