BufferedOutputStream和BufferedInputStream那些事儿

简介

BufferedOuputStream用于OutputStream的缓冲输入流类,BufferedInputStream用于InputSteam的缓冲输出流

原理

由于CPU的速度远远大于IO操作的速度,我们引入了缓冲区的概念。把数据从目标文件中取出放到缓冲区中,然后再从缓冲区中一点点的写入到我们需要存储的目标内存中。以及我们在利用输入流的时候,我们也可以先把数据先读到缓冲区中,再从缓冲区中输入,从而避免每次读入一个字节都要引起底层系统的引用

目标文件:可能来源于外设(你的U盘,硬盘)
目标存储:一般是我们的内存
需要注意的是,输入流和输出流要优先创建,因为这两种类都是作为修饰类,也就是能够对输入输出流进行优化

缓冲输入流

我们先从类的简介开始
BufferedInputStream简介.jpg

我们从这段话中,我们可以知道以下几个信息
1.缓冲输入流创建的时候,内部会创建一个缓冲区
2.它会记录我们读入的字节,保证不会出现重复和漏读的情况

看看构造函数
BufferedInputStream构造.jpg

需要我传入一个输入流

看看内部方法
方法.jpg

这里需要注意几个方法

avilable():清楚我们的输入流还有多少字节可以输入
read():把文件读入到进数组

实例

利用缓冲区,实现一张图片的复制

import java.io.*;

public class IOMain {
    public static void main(String[] args) throws Exception{
        
    }
    public static void BuffereTest() {
        
        BufferedInputStream bis=null;
        BufferedOutputStream bos = null;
        try {
            bis=new BufferedInputStream(new FileInputStream("C:\\Users\\Administrator\\Desktop\\IO\\Test.jpg"));
            bos=new BufferedOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\IO\\TestCopy.jpg"));
            int num=0;
            byte[] b=new byte[1024];
            while((num=bis.read(b))!=-1)
            {
                bos.write(b);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {
            try {
                bis.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                bos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
}

总结

分别用于提升输入流和输出流的效率

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。