缓冲流

  • 一、缓冲流概述
  • 二、缓冲流的使用
  • 2.1 缓冲流(字节型)实现非文本文件的复制
  • 2.1.1 缓冲流(字节型)实现非文本文件的复制与节点流实现的区别
  • 2.2 缓冲流(字符型)实现文本文件的复制
  • 2.2.1
  • 2.2.2 缓冲流(字符型)实现文本文件的复制与节点流实现的区别
  • 2.3 缓冲流与节点流读写速度的对比
  • 2.3.1 缓冲流速度提升的原因


一、缓冲流概述

  • 缓冲流是处理流的一种,是对节点流的一次包装
  • 处理流就是包装在其他流的基础上
  • 缓冲流的主要作用是为了提高文件的读写效率

四种缓冲流:

字符流:

BufferedReader:
BufferedWriter:

字节流:

BufferedInputStream:
BufferedOutputStream:

二、缓冲流的使用

2.1 缓冲流(字节型)实现非文本文件的复制

@Test
    public void BufferedStreamTest(){
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            //1、指定要复制的文件路径,复制的目标路径
            File inf = new File("皮卡丘.jpg");
            File otf = new File("皮卡丘副本2.jpg");

            //2、造流
            //2.1 造节点流
            fis = new FileInputStream(inf);
            fos = new FileOutputStream(otf);
            //2.2造缓冲流
            bis = new BufferedInputStream(fis);
            bos = new BufferedOutputStream(fos);


            //3、复制操作
            int len;
            byte buffer[] = new byte[1024];
            while ((len = bis.read(buffer)) != -1){

                bos.write(buffer,0,len);

            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4、关闭流
            //要求:先关闭外层流,再关闭内层流
            try {
                bis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //说明:在关闭外层流时,内层流也会自动的关闭,所以关于内层流的关闭可以省略
        }
    }

2.1.1 缓冲流(字节型)实现非文本文件的复制与节点流实现的区别

节点流实现

缓冲流实现

第一步:指定文件

File inf = new File(“皮卡丘.jpg”); File otf = new File(“皮卡丘副本2.jpg”);

相同

第二步:造流

造字节流fis = new FileInputStream(inf); fos = new FileOutputStream(otf);

缓冲流相当于对字节流的一次包装,所以造完字节流之后才能造缓冲流:bis = new BufferedInputStream(fis); bos = new BufferedOutputStream(fos);

第三步:复制操作

read(byte[] buffer); write(byte[],0,len)

read(byte[] buffer); write(byte[],0,len)

第四步:关闭流

fis.close();fos.close();

bis.close();bos.close(); 原则上要先关闭外层的缓冲流,再关闭内层的字节流,但是因为在关闭外层流的时候,内层流自动关闭,所以程序中可以不写内层流的关闭代码

2.2 缓冲流(字符型)实现文本文件的复制

2.2.1

@Test
    public  void  copyForBufferReaderWriter(){


        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;

        try {
            //1、指明文件、造流
            //1.1 造字符流
            Reader reader = new FileReader(new File("hello.txt"));
            Writer writer = new FileWriter(new File("hello1.txt"),false);//为true是不覆盖,默认为false
            //1.2 造缓冲流
            bufferedReader = new BufferedReader(reader);
            bufferedWriter = new BufferedWriter(writer);


            //2、复制操作
            //方式一:使用char[]数组
/*            int len;
            char[] arr = new char[1024];
            while ((len = bufferedReader.read(arr)) != -1){
                bufferedWriter.write(arr,0,len);//写出时注意要用三个元素的write
//                bufferedWriter.flush();
            }*/

            //方式二:使用String,一行一行地读数据
            String data;
            while ((data = bufferedReader.readLine()) != null){

                bufferedWriter.write(data);//data中不包含换行符
                bufferedWriter.newLine();//换行
            }

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

            //3、关闭外层流(内层自动关闭)
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                bufferedWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }




    }

2.2.2 缓冲流(字符型)实现文本文件的复制与节点流实现的区别

节点流实现

缓冲流实现

第一步:指定文件

File inf = new File(“皮卡丘.jpg”); File otf = new File(“皮卡丘副本2.jpg”);

相同

第二步:造流

造字节流fis = new FileInputStream(inf); fos = new FileOutputStream(otf);

缓冲流相当于对字节流的一次包装,所以造完字节流之后才能造缓冲流:bis = new BufferedInputStream(fis); bos = new BufferedOutputStream(fos);

第三步:复制操作

read(char[] cbuf); write(char[] cbuf,0,len)

方式一:read(char[] cbuf); write(char[] cbuf,0,len)方式二:String readLine()

第四步:关闭流

fis.close();fos.close();

bis.close();bos.close(); 原则上要先关闭外层的缓冲流,再关闭内层的字节流,但是因为在关闭外层流的时候,内层流自动关闭,所以程序中可以不写内层流的关闭代码

2.3 缓冲流与节点流读写速度的对比

同一代码,节点流的执行速度

java 缓冲流 缓冲大小设置原则 java的缓冲流_文本文件


同一代码,缓冲流的执行速度

java 缓冲流 缓冲大小设置原则 java的缓冲流_字节流_02


由上图可见,使用缓冲流后,文件的读写速度得到了明显提升。

2.3.1 缓冲流速度提升的原因

缓冲流内部提供了一个缓冲区
字节缓冲输入流自带8KB缓冲池,直接从缓冲池中读取数据
字节缓冲输出流自带8KB缓冲池,数据直接写入缓冲池

对处理流来讲输出都会有flush:每次调用时内存中的数据都会写出,部分流没有内部调用,需要手写

补充:flush:刷新缓冲区