为了解决不同数据流之间速度、数据格式差异的问题,以便提高输入/输出操作的效率(特别是当需要大量的输入、输出操作的程序时),因此,Java贴心的提供了过滤流。 在已存在的数据流的基础上,过滤数据流与已经存在的数据流相联系,过滤流主要包括过滤输入数据流和过滤输出流。其中,过滤输入数据流从输入数据流中读取数据(以字节或者字符的形式存在),对这些数据进行加工处理,然后向内存提供特定格式的数据。而过滤输出数据流则是从内存中读取特定格式的数据,进行加工处理后,向输出数据流提供字节数据。
缓冲区数据流相当于在数据流上增加一个缓冲区,字节(字符)数据到达缓冲数据流时,以块为单位进入缓冲数据流,其他数据流从该缓冲数据流中以字节(字符)的方读取数据 处理字节的缓冲区数据流包括缓冲区输入数据流(BufferedInputStream)和缓冲区输出数据流(BuffereredOutputStream)。另外,可以通过设定缓冲区的大小。控制输入输出操作的速度。
BufferedInputStream类的数据成员buf是一个位数组,默认2048字节。当读取数据来源时,BufferedInputStream会尽量将buf填满。当使用read()方法时,实际上是先读取buf中的数据,而不是直接对数据来源做读取。当buf中的数据不足时,BufferedInputStream才会再实现给定的InputStream对象的read()方法,即从指定的装置中提取数据。
- // BufferedInputStream类中部分字段说明
- protected byte[]:buf存储数据的内部缓冲区数组,该数组的默认大小为2048字节
-
- protected int :计算比缓冲区中最后一个有效字节的索引大1的索引
-
- protected int :marklink调用mark方法后,再后续调用reset方法失败前所允许的最大提前读取量
-
- ···
-
BufferedOutputStream的数据成员buf是一个位数组,但它的默认字节数为512.当使用write()方法写入数据时,实际上会先将数据写至buf中,当buf满时才会实现给定的OutputStream对象的wrte()方法,将buf数据写至目的地,而不是每次都对目的地做写入的动作。
BufferedOutputStream类的构造方法
BufferedOutputStream(OutputStream outputStream[,int s])
:创建以恶搞缓冲输出流,以将指定缓冲大小的数据写入指定的输出流。如果没有指定缓冲区大小,则使用默认的缓冲区大小(1024字节)。void flush()
:刷新此缓冲的输出流(与OutputStream相比,BufferedOutputStream 类才有此方法)注:在关闭缓冲输出数据流时,应该强制输出流缓冲输出数据流中的数据。否则,还有数据在缓冲区内没有完全读出来。
一般情况下。缓冲输入流缓冲区大小、缓冲输出流缓冲区大小以及指定数组的大小是相等的。每次从缓冲输入流中读出来的有效数据保存于数据b中,并记录有效数据的长度len,然后将数组中的前len个有效字节数据写入缓冲输出流中。
由于无法保证文件的实际长度是缓冲输入流缓冲区大小的整倍大小,最后一次写入缓冲区输入流时,不会把无效的数据写入缓冲数据流中。