Java 缓冲流

课堂案例

import java.io.*;

/**
 * 使用缓冲流提升的读写效率
 * copy案例2
 */
public class Demo06 {
    public static void main(String[] args) throws IOException {
        // 耗时:35196毫秒(低级流)
        // 耗时:508毫秒 (使用缓冲流)
        // 耗时:34毫秒 (使用了 byte数组批量读写)
        long start = System.currentTimeMillis();
            // 低级流
        FileInputStream  fis = new FileInputStream("和平精英.mp4");
        // 缓冲流-高级流中的一种,依赖于低级流
        BufferedInputStream bis = new BufferedInputStream(fis);
        // 写出的文件流
        FileOutputStream  fos = new FileOutputStream("荒野求生.mp4");
        BufferedOutputStream bos = new BufferedOutputStream(fos);

        byte[] data = new byte[1024 * 200];
        int l = -1;
            // fis.read() 一次读取一个字节,返回值为实际读取的一个字节的数据
            while((l=bis.read(data)) != -1){
                bos.write(data,0,l);
            }
            // 将最后的数据从缓冲区中一次写出
           bis.close();
            // 在关闭缓冲流时会自动调用flush函数清空缓冲区
           bos.close();
        long end = System.currentTimeMillis();
        System.out.println("耗时:"+(end-start)+"毫秒");
    }
}

缓冲流概述

缓冲流,也叫高效流。能够高效读写缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化对象等等。它是四个基本File流的增强,所以也是4个流,按照数据类型分类。

  • 字节缓冲流:BufferedInputStream,BufferedOutputStream
  • 字符缓冲流:BufferedReader,BufferedWriter

缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO读取次数,从而提高读写的效率。

字节缓冲流

构造方法

BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in, int size)
// 创建一个新的字节缓冲输入流
 
BufferedOutputStream(OutputStream out) // 将数据写入指定的底层输出流
BufferedOutputStream(OutputStream out, int size) // 将具有指定缓冲区大小的数据写入指定的底层输出流
// 创建一个新的字节缓冲输出流
参数:
InputStream in:字节输入流
OutputStream out:字节输出流
int size:缓冲区大小,不写的话,默认

BufferedOutputSteram——字节缓冲输出流

例子:把数据写到文件中:

1.创建FileOutputStream对象,构造方法中绑定要输出的目的地。
2.创建BufferedOutputStream对象,构造方法中传递FileOutputStream对象,提高FileOutputStream对象效率。
3.使用BufferedOutputStream对象中的方法write,把数据写入到内部冲区中。
4.使用BufferedOutputStream对象中的方法flush,把内部冲区中的数据,刷新到文件中。
5.释放资源(会先调用flush方法刷新数据,第4步可以省略)。
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
public class DemoBufferedOutputStream {
    public static void main(String[] args) throws IOException {
        method();
    }
 
    public static void method() throws IOException {
        // 创建FileOutputStream对象,构造方法中绑定要输出的目的地。
        FileOutputStream fos = new FileOutputStream("/Users/liyihua/IdeaProjects/Study/src/view/study/demo33/BufferedOutputStream.txt", true);
 
        // 创建BufferedOutputStream对象,构造方法中传递FileOutputStream对象,提高FileOutputStream对象效率。
        BufferedOutputStream bos = new BufferedOutputStream(fos);
 
        // 使用BufferedOutputStream对象中的方法write,把数据写入到内部冲区中。
        byte[] bytes = "abc".getBytes();
        bos.write(bytes);
 
        // 使用BufferedOutputStream对象中的方法flush,把内部冲区中的数据,刷新到文件中。
        bos.flush();
 
        // 释放资源(会先调用flush方法刷新数据,第4步可以省略)。
        bos.close();
        fos.close();
 
    }
}

BufferedInputStream——字节缓冲输入流

例子:读取以上生成的文件:

1.创建FileInputStream对象,构造方法中绑定要读取的效据源。
2.创建BufferedInputStream对象,构造方法中传递FileInputStream对象,提高FileInputsStream对象的读取效率
3.使用BufferedInputStream对象中的方法read,读取文件。
4.释放资源。
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
 
public class DemoBufferedInputStream {
    public static void main(String[] args) throws IOException {
        method();
    }
 
    private static void method() throws IOException {
        // 创建FileInputStream对象,构造方法中绑定要读取的效据源。
        FileInputStream fis = new FileInputStream(
                "/Users/liyihua/IdeaProjects/Study/src/view/study/demo33/BufferedOutputStream.txt"
        );
 
        // 创建BufferedInputStream对象,构造方法中传递FileInputStream对象,提高FileInputsStream对象的读取效率
        BufferedInputStream bis = new BufferedInputStream(fis);
 
        // 使用BufferedInputStream对象中的方法read,读取文件。
        int len1 = bis.read();
        System.out.println(len1);
 
        int len2 = bis.read();
        System.out.println(len2);
 
        int len3 = bis.read();
        System.out.println(len3);
 
        // 第四次读取的时候,所以的字节都已经给读取过了,返回-1
        int len4 = bis.read();
        System.out.println(len4);
 
        // 释放资源
        bis.close();
        fis.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值