缓冲区流讲解(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("\r\n");  原先手动添加换行
            bw.newLine();      // 调用换行方法
        }
        br.close();
        bw.close();
    }

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

点赞是认可,在看是支持

java IO教程《三》的更多相关文章

  1. Java IO教程

    1  Java IO 教程 2 Java IO 概述 3 Java IO: 文件 4 Java IO: 管道 5 Java IO: 网络 6 Java IO: 字节和字符数组 7 Java IO: S ...

  2. Java IO(四) InputStream 和 OutputStream

    Java IO(四) InputStream 和 OutputStream 一.介绍 InputStream 和 OutputStream 是字节流的超类(父类),都是抽象类,都是通过实例化它们的子类 ...

  3. Java IO学习--(四)网络

    Java中网络的内容或多或少的超出了Java IO的范畴.关于Java网络更多的是在我的Java网络教程中探讨.但是既然网络是一个常见的数据来源以及数据流目的地,并且因为你使用Java IO的API通 ...

  4. Java IO(四)——字符流

    一.字符流 字节流提供了处理任何类型输入/输出操作的功能(因为对于计算机而言,一切都是0和1,只需把数据以字节形式表示就够了),但它们不可以直接操作Unicode字符,因为一个Unicode字符占用2 ...

  5. Java IO教程 导读

    Java IO是一套java 用来读写数据(输入和输出)的API.大部分程序都要处理一些输入,并有输入产生一些输出.Java为此提供了java.io包. 如果你浏览下java.io包,会对其中各样的类 ...

  6. Java IO(四)

    在文件操作流中,输入输出的目标都是文件,但是有时候,我们并不需要写入文件,只是需要中转一下而已,这样就会显得很麻烦,所以我们就可以使用内存操作流.在内存操作流中,输入输出目标都是内存. 内存输出流:B ...

  7. java IO教程《四》

    properties使用 什么是Properties? Properties(Java.util.Properties),该类主要用于读取Java的配置文件,不同的编程语言有自己所支持的配置文件,配置 ...

  8. 系统学习 Java IO (十四)----字符读写缓存和回退 BufferedReader/BufferedWriter & PushbackReader

    目录:系统学习 Java IO---- 目录,概览 BufferedReader BufferedReader 类构造器接收一个 Reader 对象,为 Reader 实例提供缓冲. 缓冲可以加快 I ...

  9. Java入门教程四(字符串处理)

    Java 语言的文本数据被保存为字符或字符串类型.字符及字符串的操作主要用到 String 类和 StringBuffer 类,如连接.修改.替换.比较和查找等. 定义字符串 直接定义字符串 直接定义 ...

随机推荐

  1. Updating a Dictionary UVA - 12504

    In this problem, a dictionary is collection of key-value pairs, where keys are lower-case letters, a ...

  2. Weblogic CVE-2020-2551漏洞复现

    Weblogic CVE-2020-2551漏洞复现 0x00 前言 在一次渗透测试过程中,碰见了该漏洞,并使用在野的POC验证了这个漏洞存在,当时工具网传的利用方式去进行利用,没有成功,可能是自己太 ...

  3. 微信小程序中的自定义组件

    微信小程序中的组件 前言 之前做小程序开发的时候,对于开发来说比较头疼的莫过于自定义组件了,当时官方对这方面的文档也只是寥寥几句,一笔带过而已,所以写起来真的是非常非常痛苦!! 好在微信小程序的库从 ...

  4. table边框完全去掉的方法

    表格中边框的显示 只显示上边框 <table frame=above> 只显示下边框 <table frame=below> 只显示左.右边框 <table frame= ...

  5. ZOJ 3781 最短路(想法好题目)

    题意:       给你一个n*m的矩阵,上面只有两种字符,X或者O,每次可以同时改变相同颜色的一个连通块,上下左右连通才算连通,用最小的步数把这个图弄成全是X或者全是O,题意要是没看懂看下面的样例. ...

  6. hdu4965 巧用矩阵乘法结合律

    题意:      给两个矩阵,n*m的矩阵A,和m*n的矩阵B, 求(A*B)^(n*n)其中 m<=6,n<=1000. 思路:       一开始直接模拟,写了个矩阵快速幂,超时了,因 ...

  7. Python中的Pexpect模块的简单使用

    Pexpect 是一个用来启动子程序并对其进行自动控制的 Python 模块. Pexpect 可以用来和像 ssh.ftp.passwd.telnet 等命令行程序进行自动交互.以下所有代码都是在K ...

  8. python 压缩模块大杂烩(zipfile,bz2,lzma,gzip,tarfile,zlib)

    [*] 以下压缩模块请结合python的官方文档(https://docs.python.org/3.5/library/index.html)来实践或者对比(我的是python 3.5) 1.pyt ...

  9. Dubbo原理剖析 之 @DubboReference.version设置为*

    原文链接 Dubbo原理剖析 之 @DubboReference.version设置为* 1 背景 Dubbo在消费端提供了一个功能,即将消费者的版本号指定为*,那么不管服务端的接口版本是啥,都可以调 ...

  10. 手把手教你掌握——性能工具Jmeter之参数化(含安装教程 )

    本节大纲 Jmeter 发送get/post请求 Jmeter 之文件参数化-TXT/Csv Jmeter之文件参数化-断言 JMeter简介 Apache JMeter是一款基于JAVA的压力测试T ...