在IO包中提供两个带缓冲的字节流,分别是BufferedInputStream和BufferdOutputStream,这两个流都使用了装饰设计模式。它们的构造方法中分别接收InputStream 和OutputStream 类型的参数作为被包装对象,在读写数据时提供缓冲功能。应用程序、缓冲流和底层字节流之间的关系如图所示。
从图中可以看出应用程序是通过缓冲流来完成数据读写的,而缓冲流又是通过底层被包装的字节流与设备进行关联的。接下来通过一个案例来学习BufferedInputStream和BufferedOutputStream 这两个流的用法,如例所示。
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class IOTest { public static void main(String[] args) { try { // 创建一个带缓冲区的输入流 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:/example.txt")); // 创建一个带缓冲区的输出流 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:/example.txt")); int len; while ((len = bis.read()) != -1) { bos.write(len); } bis.close(); bos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
例中,创建了BufferedInputStream 和BufferedOutputStream 两个缓冲流对象,这两个流内部都定义了一个大小为8192的字节数组,当调用read()或者write()方法读写数据时,首先将读写的数据存入定义好的字节数组,然后将字节数组的数据一次性读写到文件中,这种方式与字节流的缓冲区类似,都对数据进行了缓冲,从而有效的提高了数据的读写效率。