您的位置:首页 > 其它

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

2017-08-20 20:06 302 查看
首先不使用带缓冲的字节流:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: