Java字节流之使用字节缓冲流

一、使用字节缓冲流

BufferedInputStream和BufferedOutputStream称为字节缓冲流,使用字节缓冲流内置了一个缓冲区,第 一次调用read方法时尽可能多地从数据源读取数据到缓冲区,后续再到用read方法时先看看缓冲区中是 否有数据,如果有则读缓冲区中的数据,如果没有再将数据源中的数据读入到缓冲区,这样可以减少 直接读数据源的次数。通过输出流调用write方法写入数据时,也先将数据写入到缓冲区,缓冲区满了 之后再写入数据目的地,这样可以减少直接对数据目的地写入次数。使用了缓冲字节流可以减少I/O操 作次数,提高效率。
BufferedInputStream的父类是FilterInputStream,BufferedOutputStream的父类是 FilterOutputStream,FilterInputStream和FilterOutputStream称为过滤流。过滤流的作用是扩展其他流, 增强其功能。那么BufferedInputStream和BufferedOutputStream增强了缓冲能力。
过滤流实现了装饰器(Decorator)设计模式,这种设计模式能够在运行时扩充一个类的功 能。而继承在编译时扩充一个类的功能。
BufferedInputStream和BufferedOutputStream中主要方法都是继承自InputStream和OutputStream。下面介绍一下它们的构造方法。
BufferedInputStream构造方法主要有:

  • BufferedInputStream(InputStream in):通过一个底层输入流in对象创建缓冲流对象,缓冲区大小 是默认的,默认值8192。
  • BufferedInputStream(InputStream in, int size):通过一个底层输入流in对象创建缓冲流对象,size 指定的缓冲区大小,缓冲区大小应该是2的n次幂,这样可提供缓冲区的利用率。

BufferedOutputStream构造方法主要有:

  • BufferedOutputStream(OutputStream out):通过一个底层输出流out 对象创建缓冲流对象,缓冲区 大小是默认的,默认值8192。
  • BufferedOutputStream(OutputStream out, int size):通过一个底层输出流out对象创建缓冲流对象, size指定的缓冲区大小,缓冲区大小应该是2的n次幂,这样可提高缓冲区的利用率。

案例代码如下:

import java.io.*;

public class FileCopyWithBuffer {
    public static void main(String[] args) {
//        创建文件输入流,底层流,通过它构造缓冲输入流
        try(FileInputStream in = new FileInputStream("/Users/caizhengjie/Desktop/qq/123.txt");
            BufferedInputStream bis = new BufferedInputStream(in);
            FileOutputStream out = new FileOutputStream("/Users/caizhengjie/Desktop/qq/asd/1234.txt");
//            构造缓冲输出流
            BufferedOutputStream bos = new BufferedOutputStream(out)){

//           开始时间
            long starttime = System.nanoTime();
//            准备一个缓冲区,这个缓冲区与缓冲区内置的缓冲区不同,决定是否进行I/O操作的次数的是缓冲区内置的缓冲区,不是次缓冲区
            byte[] buffer = new byte[1024];
//            首先读取一次
            int len = bis.read(buffer);
            while (len!=-1){
//                开始写入数据
                bos.write(buffer,0,len);
//                再读取一次
                len = bis.read(buffer);
            }
//            结束时间
            long elapsedTime = System.nanoTime()-starttime;
            System.out.println("耗时"+(elapsedTime/1000000.0)+"毫秒");

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行时间:

耗时0.030161毫秒

FileCopy与FileCopyWithBuffer复制相同文件src.zip,缓冲区buffer都设置1024
FileCopy运行时间:

耗时0.246213毫秒

由此可见使用缓冲流的FileCopyWithBuffer明显要比不使 用缓冲流的FileCopy速度快。

以上内容仅供参考学习,如有侵权请联系我删除!
如果这篇文章对您有帮助,左下角的大拇指就是对博主最大的鼓励。
您的鼓励就是博主最大的动力!

发布了69 篇原创文章 · 获赞 7 · 访问量 3331

猜你喜欢

转载自blog.csdn.net/weixin_45366499/article/details/104314094