目录
通过前面的学习我们已经学习了Java的两种IO流:字节流和字节缓冲流。通过学习已经知道字节缓冲流是字节流的升级版,大大提高了执行效率,那么他们的执行效率究竟存在多大的区别呢?接下来让我们一起通过实验看一看!
一、方案设计
需求:复制一个大小为118M的视频文件
思路:
1. 根据数据源创建字节输入流对象
2. 根据目的地创建字节输出流对家
3. 读写数据,复制视频(一次读报一个字节数组,一次写入一个字节数组)
4. 释放资源
实现方法:
1. 基本字节流一次读写一个字节
2. 基本字节流一次读写一个字节数组
3. 字节缓冲流一次读写一个字节
4. 字节缓冲流—次读写一个字节数组
时间计算方法:利用 System.currentTimeMillis()返回当前时间毫秒数,作差即可
long starttime = System.currentTimeMillis(); //不同的方案 long endtime = System.currentTimeMillis(); System.out.println("共花费了"+(endtime - starttime) +"ms");
二、方案实施
实施思路:我们将四种不同的方案编写为4个函数,分别调用
视频文件:采用薛之谦与郁可唯合唱的歌曲《纸船》的MV,约118M。
1. 字节流一次读写一个字节
//基本字节流一次读写一个字节
public static void ByteStream1() throws IOException {
FileInputStream fis = new FileInputStream("纸船.mp4");
FileOutputStream fos = new FileOutputStream("纸船副本.mp4");
int data;
while((data = fis.read()) != -1) {
fos.write(data);
}
fos.close();
fis.close();
}
结果:
读写共花费了1161614ms,约为19.36分钟。
2. 字节流一次读写一个字节数组
//基本字节流一次读写一个字节数组
public static void ByteStream2() throws IOException {
FileInputStream fis = new FileInputStream("纸船.mp4");
FileOutputStream fos = new FileOutputStream("纸船副本.mp4");
byte[] datas = new byte[1024];
int len;
while((len = fis.read(datas)) != -1) {
fos.write(datas,0,len);
}
fos.close();
fis.close();
}
结果:
共花费了916ms,大约1s。
3. 字节缓冲流一次读取一个字节
//字节缓冲流一次读写一个字节
public static void ByteBufferedStream1() throws IOException {
FileInputStream fis = new FileInputStream("纸船.mp4");
FileOutputStream fos = new FileOutputStream("纸船副本.mp4");
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int data;
while((data = bis.read()) != -1) {
bos.write(data);
}
bos.close();
bis.close();
}
结果:
共花费了3269ms,大约为3s。
4. 字节缓冲流一次读取一个字节数组
//字节缓冲流—次读写一个字节数组
public static void ByteBufferedStream2() throws IOException {
FileInputStream fis = new FileInputStream("纸船.mp4");
FileOutputStream fos = new FileOutputStream("纸船副本.mp4");
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] datas = new byte[1024];
int len;
while((len = bis.read(datas)) != -1) {
bos.write(datas,0,len);
}
bos.close();
bis.close();
}
结果:
共花费了295ms,约0.3s。
三、结果分析
通过实验我们可以得到在同样读取一个字节或一个字节数组的条件下,字节缓冲流的读写速度明显快于普通字节流。其中一次读取一个字节时,缓冲流快了约355倍,一次读取一个字节数组时缓冲流快了约3倍。