字节流缓冲流
在IO包中提供了两个带缓冲的字节流,分别是BufferedInputStream和BufferedOutputStream,它们的构造方法中分别接收InputStream和OutputStream类型的参数作为对象,在读写数据时提供缓冲功能。应用程序、缓冲流和底层字节流之间的关系如图1所示。
图1 缓冲流
从图1可以看出,应用程序是通过缓冲流来完成数据读写的,而缓冲流又是通过底层的字节流与设备进行关联的。接下来通过一个案例来学习BufferedInputStream和BufferedOutputStream 这两个缓冲流的用法。
同样以上一小节中的拷贝图片文件为例,使用字节缓冲流的实现代码如文件1所示。
文件1 Example06.java
1 import java.io.*;
2 public class Example06 {
3 public static void main(String[] args) throws Exception {
4 // 创建用于输入和输出的字节缓冲流对象
5 BufferedInputStream bis = new BufferedInputStream(
6 new FileInputStream("source/src.jpg"));
7 BufferedOutputStream bos = new BufferedOutputStream(
8 new FileOutputStream("target/dest.jpg"));
9 // 定义一个int类型的变量len
10 int len = 0;
11 // 获取拷贝文件前的系统时间
12 long beginTime = System.currentTimeMillis();
13 // 通过循环读取输入字节缓冲流中的数据,并通过输出字节缓冲流写入到新文件
14 while ((bis.read()) != -1) {
15 bos.write(len);
16 }
17 // 获取拷贝之后的系统时间
18 long endTime = System.currentTimeMillis();
19 // 输出拷贝花费时间
20 System.out.println("花费时间为:"+(endTime-beginTime) +"毫秒");
21 // 关闭流
22 bis.close();
23 bos.close();
24 }
25 }
运行结果如图2所示。
图2 运行结果
文件1中,创建了BufferedInputStream和BufferedOutputStream两个缓冲流对象,这两个流内部都定义了一个大小为8192的字节数组,当调用read()或者write()方法读写数据时,首先将读写的数据存入到定义好的字节数组,然后将字节数组的数据一次性读写到文件中,这种方式与前面小节中讲解的字节流的缓冲区类似,都对数据进行了缓冲,从而有效的提高了数据的读写效率。