学科分类
目录

字节流的缓冲区

虽然上一小节实现了文件的拷贝,但是一个字节一个字节的读写,需要频繁的操作文件,这种效率是非常低的。这就好比从北京运送快递到上海,如果有一万件快递,一件一件的运送就必须运输一万次,这样的效率显然非常低。为了减少运输次数,可以先把一批快递装在一个车厢中,这样就可以成批的运送快递,这时的车厢就相当于一个临时缓冲区。同样,当通过流的方式拷贝文件时,为了提高传输效率,也可以定义一个字节数组作为缓冲区。这样,在拷贝文件时,就可以一次性读取多个字节的数据,将数据先保存在字节数组中,然后将字节数组中的数据一次性写入到新文件中。

接下来通过案例来学习一下如何使用缓冲区来拷贝文件,如文件1所示。

文件1 Example05.java

 1    import java.io.*;
 2    public class Example05 {
 3        public static void main(String[] args) throws Exception {
 4            // 创建文件输入流对象读取指定目录下的文件
 5            FileInputStream in = new FileInputStream("source/src.jpg");
 6            // 创建文件输出流对象将读取到的文件内容写入到指定目录的文件中
 7            FileOutputStream out = new FileOutputStream("target/dest.jpg");
 8            // 定义一个int类型的变量len
 9            int len = 0;
 10            // 定义一个长度为1024的字节数组
 11            byte[] buff = new byte[1024];
 12            // 获取拷贝文件前的系统时间
 13            long beginTime = System.currentTimeMillis();
 14            // 通过循环将读取到的文件字节信息写入到新文件
 15            while ((len = in.read(buff)) != -1) {
 16                // 每循环读取一次字节数组,就将所读取到的内容写入到文件
 17                out.write(buff,0,len);
 18            }
 19            // 获取拷贝之后的系统时间
 20            long endTime = System.currentTimeMillis();
 21            // 输出拷贝花费时间
 22            System.out.println("花费时间为:"+(endTime-beginTime) +"毫秒");
 23            // 关闭流
 24            in.close();
 25            out.close();
 26        }
 27    }

文件1同样实现了图片文件的拷贝。在拷贝过程中,使用while循环语句逐渐实现字节文件的拷贝,每循环一次,就从文件读取若干字节填充到字节数组,并通过变量len记住读入数组的字节数,然后从数组的第一个字节开始,将len个字节依次写入到新文件。循环往复,当len值为-1时,说明已经读到了文件的末尾,循环会结束,整个拷贝过程也就结束了,最终程序会将整个文件拷贝到目标文件夹,并将拷贝过程所消耗的时间打印了出来,如图1所示。

图1 运行结果

通过图1可以看出拷贝文件所消耗的时间明显减少了很多,这说明使用缓冲区读写文件可以有效的提高程序的传输效率。程序中的缓冲区就是一块内存,该内存主要用于存放暂时输入/输出的数据,由于使用缓冲区减少了对文件的操作次数,所以可以提高读写数据的效率。

点击此处
隐藏目录