• java IO教程《三》


    缓冲区流讲解(Buffered)

    什么是缓冲区?

    缓冲流,也叫高效流,是对4个基本的File流的增强,所以也是4个流,按照数据类型分类:

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

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

    缓冲技术的原理?

    加载过程加载过程

    整个过程可以形容成一个快递小哥,开始时候自行车送快递,一趟只能送一个,但是后来老板看他们太幸苦了,给他们配备了一辆五菱宏光,一次可以送好几十个,这就大大提高了效率。

    缓冲区流采用装饰者模式去包装文件流跟字符流

    字节流缓冲区

    BufferedInputStream

    Java BufferedInputStream类用于从流中读取信息。它内部使用缓冲机制来提高性能。BufferedInputStream的要点是:

    • 当跳过或读取流中的字节时,内部缓冲区会自动从包含的输入流中重新填充,每次填充许多字节。

    • 创建BufferedInputStream时,会创建一个内部缓冲区数组。

    构造函数:

    构造函数说明
    BufferedInputStream(InputStream IS) 它创建新的缓冲输出流,用于将数据写入指定的输出流。
    BufferedInputStream(InputStream IS, int size) 创建新的缓冲输出流,用于将数据写入具有指定缓冲区大小的指定输出流。

    方法:

    方法说明
    int available() 它将指定的字节写入缓冲输出流。
    int read() 它从给定的偏移量开始,将指定字节输入流中的字节写入指定的字节数组
    int read(byte[] b, int off, int ln) 刷新缓冲区
    void close() 刷新缓冲区
    void reset() 刷新缓冲区
    long skip(long x) 刷新缓冲区

    BufferedOutputStream

    Java BufferedOutputStream类用于缓冲输出流。它在内部使用缓冲区来存储数据。与直接将数据写入流相比,它提高了效率。因此,它使性能快速。要在OutputStream中添加缓冲区,请使用BufferedOutputStream类。让我们看看在OutputStream中添加缓冲区的语法:

    构造函数:

    构造函数说明
    BufferedOutputStream(OutputStream os) 它创建新的缓冲输出流,用于将数据写入指定的输出流。
    BufferedOutputStream(OutputStream os, int size) 创建新的缓冲输出流,用于将数据写入具有指定缓冲区大小的指定输出流。

    方法:

    方法说明
    void write(int b) 它将指定的字节写入缓冲输出流。
    void write(byte[] b, int off, int len) 它从给定的偏移量开始,将指定字节输入流中的字节写入指定的字节数组
    void flush() 刷新缓冲区

    字符流缓冲区

    BufferedWriter

    Java BufferedWriter类用于为Writer实例提供缓冲。写入速度很快。继承Writer类。缓冲字符用于提供对单个数组、字符和字符串的有效写入。

    构造函数:

    构造函数说明
    BufferedWriter(Writer wrt) 它用于创建使用输出缓冲区的默认大小的缓冲字符输出流。
    BufferedWriter(Writer wrt, int size) 它用于创建使用指定大小的输出缓冲区的缓冲字符输出流。

    方法:

    方法说明
    void newLine() 通过编写行分隔符来添加新行。
    void write(int c) 用于写入单个字符。
    void write(char[] cbuf, int off, int len) 用于写入字符数组的一部分
    void write(String s, int off, int len) 用于写入字符串的一部分。
    void flush() 刷新输入流。|
    void close() 关闭缓冲区。

    BufferedReader

    Java BufferedReader类用于从基于字符的输入流中读取文本。可以通过readLine()方法逐行读取数据。读取速度很快。继承了Reader类。

    构造函数:

    构造函数说明
    BufferedReader(Reader rd) 它用于创建使用输入缓冲区的默认大小的缓冲字符输出流。
    BufferedReader(Reader rd, int size) 它用于创建使用指定大小的缓冲区的缓冲字符输入流。

    方法:

    方法说明
    int read() 读取一个字节。
    int read(char[] cbuf, int off, int len) 用于将字符读入数组的一部分。
    boolean markSupported() 用于测试输入流对标记和重置方法的支持。
    String readLine() 用于读取一行文本。
    boolean ready() 用于测试输入流是否准备好读取。|
    long skip(long n) 跳过字节数
    boolean ready() 用于测试输入流是否准备好读取。
    void reset() 它将流重新定位到上次在此输入流上调用mark方法的位置。
    void mark(int readAheadLimit) 用于标记流中的当前位置。
    void close() 它关闭输入流并释放与该流关联的任何系统资源。

    实战

    读取文件内容然后写入另外一个文件

    字节缓冲区流

     public static void main(String[] args) {
            //创建一个字节流,用于读取当前目录下的source文件夹中的压缩文件
            InputStream in = new FileInputStream("/home/lumeng/practise_lum/uml_tmp_file.rar");
            //创建一个文件字节输出流,用于将读取的数据写入test目录
            OutputStream out = new FileOutputStream("/home/lumeng/practise_lum/test/uml_tmp_file.rar");
            byte[] buff = new byte[1024];  //定义一个字节数组,作为缓冲区
            int len; //定义一个int类型的变量len,记住每次读取的一个字节
            long begintime = System.currentTimeMillis();//获取拷贝文件前的系统时间
            while ((len = in.read(buff)) != -1) { //读取一个字节并判断是不是读到文件结尾
                out.write(buff, 0, len);//从第一个字节开始,向文件写入len个字节
            }
            long endtime = System.currentTimeMillis();//获取文件拷贝结束时的系统时间
            System.out.println("拷贝文件所消耗的时间是:" + ((endtime - begintime) / 1000) + "秒");
            in.close();
            out.close();
        }

    在拷贝的过程中,使用while循环语句,逐渐实现字节文件的拷贝,每循环一次,就从文件读取若干字节填充字节数组,并通过len记住读入数组的字节数,然后从数组的第一个字节开始,将len字节依次写入文件。循环往复,当len的值为-1时,说明已经读到了文件的末尾,循环结束,整个拷贝过程结束。我们可以看出这种操作比单纯字节留拷贝快很多。

    字符缓冲区流

     public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new FileReader("D:\b.txt"));
            BufferedWriter bw = new BufferedWriter(new FileWriter("E:\b.txt"));

            String len =null;
            while ((len = br.readLine())!=null){//注意此处readLine的默认值是null区别read()
                bw.write(len);
                 //bw.write(" ");  原先手动添加换行
                bw.newLine();      // 调用换行方法
            }
            br.close();
            bw.close();
        }

    识别下方二维码!回复: 入群 ,扫码加入我们交流群!

    点赞是认可,在看是支持点赞是认可,在看是支持

    欢迎关注我的公众号!里面可以加入微信技术交流群!
  • 相关阅读:
    IIS应用程序池自动化回收脚本
    gitlab修改克隆地址
    docker安装的gitalb备份及数据迁移
    docker安装gitlab
    docker安装的gitlab备份脚本
    sql server 2016 维护计划执行,提示执行失败。有关详细信息,请参阅维护计划和sql server 代理作业历史记录日志。
    SSH使用证书登录
    docker搭建 rabbitmq集群
    VMware Workstation Pro设置nat模式上网
    docker-compose搭建discuz论坛
  • 原文地址:https://www.cnblogs.com/1ssqq1lxr/p/14837152.html
Copyright © 2020-2023  润新知