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