Java IO流详解(五)——缓冲流

缓冲流也叫高效流,是处理流的一种,即是作用在流上的流。其目的就是加快读取和写入数据的速度。

缓冲流本身并没有IO功能,只是在别的流上加上缓冲效果从而提高了效率。当对文件或其他目标频繁读写或操作效率低,效能差时。这时使用缓冲流能够更高效的读写信息。因为缓冲流先将数据缓存起来,然后一起写入或读取出来。所以说,缓冲流还是很重要的,在IO操作时加上缓冲流提升性能。

Java IO流中对应的缓冲流有以下四个:

字节缓冲流:BufferedInputStream、BufferedOutputStream

字符缓冲流:BufferedReader、BufferedWriter

1、字节缓冲流

构造方法:

输入流:

  • BufferedInputStream(InputStream in):创建一个新的字节缓冲输入流,传入的参数是InputStream类型,缓冲区默认大小为8129。
  • BufferedInputStream(InputStream in, int size):创建一个指定缓冲区大小的字节缓冲输入流。

输出流:

  • BufferedOutputStream(OutputStream out):创建一个新的字节缓冲输出流,传入的参数是OutputStream ,以将数据写入指定的基础输出流。
  • BufferedOutputStream(OutputStream out, int size):创建一个指定缓冲区大小的的字节缓冲输出流,以将具有指定缓冲区大小的数据写入指定的基础输出流。

构造方法举例代码如下:

    //字节缓冲输入输出流,此种方法默认缓冲区大小8192
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\IO\\hello.txt"));
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\IO\\hello.txt"));
    //自定义缓冲区大小
    BufferedInputStream bis1 = new BufferedInputStream(new FileInputStream("D:\\IO\\hello.txt"),10240);
    BufferedOutputStream bos1 = new BufferedOutputStream(new FileOutputStream("D:\\IO\\hello.txt"),10240);

前面就说缓冲流可以加快读取和写入数据的速度,所以现在就来比较一下使用普通流和使用缓冲流的效率对比(拷贝一个886MB大小的视频):

普通流代码示例:

package com.thr;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author Administrator
 * @date 2020-02-26
 * @desc 普通流测试
 */
public class BufferedDemo {
    public static void main(String[] args) {
        //定义流
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            //开始时间
            long start = System.currentTimeMillis();
            //创建流对象
            fis = new FileInputStream("D:\\IO\\1.mp4");
            fos = new FileOutputStream("D:\\IO\\2.mp4");
            //读写操作
            int len;
            byte[] buffer = new byte[1024];
            while ((len=fis.read(buffer))!=-1){
                fos.write(buffer,0,len);
            }
            //结束时间
            long end = System.currentTimeMillis();
            System.out.println("完成,共耗时:"+(end-start)+"ms");

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                fos.close();
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
//完成,共耗时:5165ms

缓冲流代码示例:

package com.thr;

import java.io.*;

/**
 * @author Administrator
 * @date 2020-02-26
 * @desc 缓冲流测试
 */
public class BufferedDemo1 {
    public static void main(String[] args) {
        //定义缓冲流
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            //开始时间
            long start = System.currentTimeMillis();
            //创建缓冲流对象,注意参数传的FileXXX,而不文件目录
            bis = new BufferedInputStream(new FileInputStream("D:\\IO\\1.mp4"));
            bos = new BufferedOutputStream(new FileOutputStream("D:\\IO\\3.mp4"));
            //读写操作
            int len;
            byte[] buffer = new byte[1024];
            while ((len=bis.read(buffer))!=-1){
                bos.write(buffer,0,len);
            }
            //结束时间
            long end = System.currentTimeMillis();
            System.out.println("完成,共耗时:"+(end-start)+"ms");

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                bos.close();
                bis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
//完成,共耗时:1658ms

我们可以看出缓冲流大概只用了三分之一的时间就完成了同样的工作。

2、字符缓冲流

构造方法

输入流:

  • BufferedReader(Reader in):创建一个新的字符缓冲输入流,传入的参数是Reader类型,缓冲区默认大小为8129。
  • BufferedReader(Reader in, int sz):创建一个指定大小缓冲区的字符缓冲输入流。

输出流:

  • BufferedWriter(Writer out):创建一个新的字符缓冲输出流,传入的参数是Writer类型,缓冲区默认大小为8129。
  • BufferedWriter(Writer out, int sz):创建一个指定大小缓冲区的字符缓冲输出流。

构造方法举例代码如下:

    //字符缓冲输入输出流,此种方法默认缓冲区大小为defaultCharBufferSize = 8192;
    BufferedReader br = new BufferedReader(new FileReader("D:\\IO\\hello.txt"));
    BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\IO\\hello.txt"));
    //自定义缓冲区大小
    BufferedReader br1 = new BufferedReader(new FileReader("D:\\IO\\hello.txt"),10240);
    BufferedWriter bw1 = new BufferedWriter(new FileWriter("D:\\IO\\hello.txt"),10240);

字符缓冲流和字节缓冲流的使用大致一样,只是两者处理的东西不一样。但是在字符缓冲流中它有两个独特的方法。

  • BufferedReader:public String readLine():读一行数据。 读取到最后返回null。

  • BufferedWriter:public void newLine():换行,该方法内部调用了lineSeparator,它表示的换行符。

两个方法使用举例:

package com.thr;

import java.io.*;

/**
 * @author Administrator
 * @date 2020-02-26
 * @desc ReadLine和newLine的使用
 */
public class BufferedTest {
    public static void main(String[] args) {
        BufferedReader br = null;
        BufferedWriter bw = null;
        try {

            br = new BufferedReader(new FileReader("D:\\IO\\hello.txt"));
            bw = new BufferedWriter(new FileWriter("D:\\IO\\hi.txt"));

            //1、普通字符数组方式
           /* int len;
            char[] buffer = new char[1024];
            while ((len=br.read(buffer))!=-1){
                bw.write(buffer,0,len);
            }
            System.out.println("拷贝完成...");*/

            //2、使用readLine和newLine的方式
            String data;
            while ((data=br.readLine())!=null){//不再是-1,因为返回的String类型
                //每次读取一行数据
                bw.write(data);//这样输出来的文件是没有换行的,所以要在后面加上newLine()方法用来换行
                bw.newLine();
            }
            System.out.println("拷贝完成...");

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (bw!=null){
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (br!=null){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

原文地址:https://www.cnblogs.com/tanghaorong/p/12361256.html

时间: 2024-10-10 21:02:09

Java IO流详解(五)——缓冲流的相关文章

Java IO最详解

初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见. 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是java io 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接口,Serializa

java io实例详解

import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileO

java知识点分享,IO流详解!

Java知识IO流详解有人觉得IO知识不太重要,其实不然,IO的使用范围很广,最能体现IO价值的就是网络上的数据传递,尤其是进入互联网时代后,各种常见的分布式架构,都少不了IO的体现.并且很多大厂的面试题中都会体现出对IO的重视,包括衍生出来的NIO.序列化等等.因此学好IO,变成了一件很重要的事情.IO基本概念IO可以简单的理解成INPUT和OUT,代表输入输出的意思.输入就是读,输出就是写.IO可以读写硬盘.光盘.内存.键盘.网络等资源上的数据.流IO中的流就相当于现实生活中的水流一样,一打

Java IO流详解

初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见. 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是java io 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接口,Serializa

基于JavaSE阶段的IO流详解

1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有输入流类都是抽象类,是InputStream或者抽象类Reader的子类:而所有输出流都是抽象类,是OutputStream或者Writer的子类.输入输出流的定义是根据流向所决定的,我们可以是本地为一个实体物质,从外界往本地输入,按照本地的状态就是读取,反之,从本地向外写入就是输出.IO流是最基本

Java核心知识点-字节流和字符流详解

字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 区别:实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如图12-6所示. 下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作完成之后都不关闭输出流. 范例:使用字节流不关闭执行 Java代码   package org.lxh.demo12.byteiodemo; import java.io.File; import 

java中的io系统详解

java中的io系统详解 分类: JAVA开发应用 笔记(读书.心得)2009-03-04 11:26 46118人阅读 评论(37) 收藏 举报 javaiostreamconstructorstringbyte 相关读书笔记.心得文章列表 Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他

详解 随机访问流

(请观看本人博文--<详解 I/O流>) RandomAccessFile 类 (随机访问流) 概述: RandomAccessFile 类 的实例支持对随机访问文件的读取和写入. 随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组. 存在指向该隐含数组的光标或索引,称为文件指针: 输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针.如果随机访问文件以读取/写入模式创建,则输出操作也可用: 输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针.写入隐

J2SE知识点归纳笔记(七)---Java IO Part 4:基本字符流

J2SE知识点归纳笔记(七)---Java IO Part 4:基本字符流                                                                 --转载请注明出处:coder-pig 本节引言: 上一节中,我们对于Java IO流中的一些基本字节流进行了学习,他们都是InputStream与 OutputStream的子类;本节学习的字符流则是Reader与Writer的子类,好了,话不多说, 开始本节内容! 本节正文: 1.Reade