使用带缓冲的字节流读写数据

Posted 云晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用带缓冲的字节流读写数据相关的知识,希望对你有一定的参考价值。

首先不使用带缓冲的字节流:

package com.yunqing;

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

public class bytelianxi {
    public static void main(String[] args) {

        try {
            //输入流"video.mp4":  相对路径:idea读取根目录下的video.mp4文件
            FileInputStream fis=new FileInputStream("video.mp4");
            //输出流,
            FileOutputStream fos=new FileOutputStream("newvideo.mp4");

            //声明一个byte字节数组吗,,每次读取100字节
            //这个字节可以根据读取文件的大小自行调整,假如读取一个100兆的视频,每次100字节效率会很慢
            //就可以多写一些,100000字节或者更多。******这个很影响效率的需要根据读取文件的大小自行调整。
            byte bt[]=new byte[100];
            int count=0;
            //距离1970年1月1号0点的毫秒数
            long curr=System.currentTimeMillis();
            //循环读取并写入文件,假如100兆的文件,每次读写100字节,那要循环很多很多次,这就影响效率
            while (fis.read(bt)!=-1){
                fos.write(bt);
                count++;
            }
            //关闭输入输出流
            fos.close();
            fis.close();

            System.out.println("循环次数"+count);
            //看读取这个文件的时间,毫秒。也就是效率
            System.out.println(System.currentTimeMillis()-curr+"毫秒");

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

    }
}

结果:2秒多效率很低

com.yunqing.bytelianxi
循环次数387974
2475毫秒

Process finished with exit code 0

 

然后进行优化,使用带缓冲的字节流读取数据

BufferedInputStream是带缓冲区的输入流,默认缓冲区大小是8M,能够减少访问磁盘的次数,提高文件读取性能;BufferedOutputStream是带缓冲区的输出流,能够提高文件的写入效率。BufferedInputStream与BufferedOutputStream分别是FilterInputStream类和FilterOutputStream类的子类,实现了装饰设计模式。

package com.yunqing;

import java.io.*;

public class youhua {
    public static void main(String[] args) {

        try {
            //输入流
            FileInputStream fis=new FileInputStream("video.mp4");
            //带缓冲的输入流
            //size:100000*****注意:idea的写法。缓冲区的大小,缓冲区的大小也影响读写效率,
            //如果读写的文件太大,也要适当的增加缓冲区的大小。
            BufferedInputStream bis=new BufferedInputStream(fis,100000);
            //输出流
            FileOutputStream fos=new FileOutputStream("new_video.mp4");
            //带缓冲的输出流
            BufferedOutputStream bos=new BufferedOutputStream(fos,100000);
            //这里我读取的是一个40兆左右的视频文件,设定一次读写100000字节,减少循环次数
            byte bt[]=new byte[100000];
            int count=0;
            long curr=System.currentTimeMillis();
            while (bis.read(bt)!=-1){
                bos.write(bt);
                count++;
            }
            //关闭字节流,后打开的先关闭
            bos.close();
            fos.close();
            bis.close();
            fis.close();
            System.out.println("循环次数"+count);
            System.out.println(System.currentTimeMillis()-curr+"毫秒");

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

    }
}

结果:仅仅用了53毫秒

com.yunqing.youhua
循环次数388
53毫秒

Process finished with exit code 0

 

以上是关于使用带缓冲的字节流读写数据的主要内容,如果未能解决你的问题,请参考以下文章

Java IO流 - 缓冲流的详细使用介绍

IO拷贝代码

Java中的字节流和字符流区别

Java中的字节流和字符流区别

IO流 - 复制文件(字节缓冲流+字节流)

JavaSE基础九----<IO流 >流的体系和分类,字节流,字节缓冲流