题干:
分别使用字节流和字节缓冲流,实现文本文件/图片/视频文件的复制。并比较二者在数据复制方面的效率(提示:日期类
试验过程和遇到的问题:
明明视频只有短短3秒,占用内存1.25MB,但是字节流复制视频的时常计算方法二(一次读写一个字节数组)却用了7854毫秒,有蹊跷,
后来检查得知
对于3秒1.25MB的视频,字节流复制速度如下:
方法一:字节流复制视频的时常计算(一次读写一个字节)
共耗时:7755毫秒
-----------
方法二:字节流复制视频的时常计算(一次读写一个字节数组)
共耗时:15毫秒
-----------
方法三:字节缓冲流一次读写一个字节
共耗时:15毫秒
-----------
方法四:字节缓冲流一次读写一个字节数组)
共耗时:5毫秒
进程已结束,退出代码 0
按输出速度排序:
数据较小时(一次读写一个数组较快):
字节缓冲流一次读写一个字节数组 > 字节流复制视频的时常计算(一次读写一个字节数组) >字节缓冲流一次读写一个字节 > 字节流复制视频的时常计算(一次读写一个字节)
试着将视频大小扩大到20MB以上:
结果如下:
方法一:字节流复制视频的时常计算(一次读写一个字节)
共耗时:236310毫秒
-----------
方法二:字节流复制视频的时常计算(一次读写一个字节数组)
共耗时:314毫秒
-----------
方法三:字节缓冲流一次读写一个字节
共耗时:275毫秒
-----------
方法四:字节缓冲流一次读写一个字节数组
共耗时:75毫秒
进程已结束,退出代码 0
最终得出比较结果:
按输出速度排序:
数据较大时(字节缓冲流较快)(默认):
字节缓冲流一次读写一个字节数组 > 字节缓冲流一次读写一个字节 >字节流复制视频的时常计算(一次读写一个字节数组) > 字节流复制视频的时常计算(一次读写一个字节)
完整代码如下:
package com.B.IOStream_14.IODemo;
import java.io.*;
//1.25MB3秒视频
//1.分别使用字节流和字节缓冲流,实现文本文件/图片/视频文件的复制。
// 并比较二者在数据复制方面的效率(提示:日期类)
public class A1Copymp4 {
public A1Copymp4() throws FileNotFoundException {
}
public static void main(String[] args) throws IOException {
//记录开始时间
long startTime1 = System.currentTimeMillis();
// 复制视频
//调用方法一:
time1();
System.out.println("方法一:字节流复制视频的时常计算(一次读写一个字节)");
// 记录结束时间
long endTime1 = System.currentTimeMillis();
System.out.println("共耗时:" + (endTime1 - startTime1) + "毫秒");
System.out.println("-----------");
// 调用方法二:
long startTime2 = System.currentTimeMillis();
time2();
System.out.println(" 方法二:字节流复制视频的时常计算(一次读写一个字节数组)");
long endTime2 = System.currentTimeMillis();
System.out.println("共耗时:" + (endTime2 - startTime2) + "毫秒");
System.out.println("-----------");
// 调用方法三:
long startTime3 = System.currentTimeMillis();
time3();
System.out.println("方法三:字节缓冲流一次读写一个字节");
long endTime3 = System.currentTimeMillis();
System.out.println("共耗时:" + (endTime3 - startTime3) + "毫秒");
System.out.println("-----------");
// 调用方法四:
long startTime4 = System.currentTimeMillis();
time4();
System.out.println("方法四:字节缓冲流一次读写一个字节数组)");
long endTime4 = System.currentTimeMillis();
System.out.println("共耗时:" + (endTime4 - startTime4) + "毫秒");
}
// 方法一:字节流复制视频的时常计算(一次读写一个字节)
public static void time1() throws IOException {
// 根据数据源创建字节输入流对象
FileInputStream fis = new FileInputStream("D:\\我的文档鸭\\图片素材\\意气风发正少年.mp4");
//根据目的地创建字节输出流对象
FileOutputStream fos = new FileOutputStream("E:\\yangzhou\\后端关卡8-16\\关卡14_文件IO流\\02_字节流\\作业\\Homework\\是羡羡鸭.mp4");
//读写数据,复制图片(一次读取一个字节,一次写入一个字节)
int by;
while ((by = fis.read()) != -1) {
fos.write(by);
}
// 释放资源
fis.close();
fos.close();
}
// 方法二:字节流复制视频的时常计算(一次读写一个字节数组)
public static void time2() throws IOException {
// 根据数据源创建字节输入流对象
FileInputStream fis = new FileInputStream("D:\\我的文档鸭\\图片素材\\意气风发正少年.mp4");
//根据目的地创建字节输出流对象
FileOutputStream fos = new FileOutputStream("E:\\yangzhou\\后端关卡8-16\\关卡14_文件IO流\\02_字节流\\作业\\Homework\\是羡羡鸭.mp4");
//读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
byte[] bys = new byte[1024];
int len;
while ((len = fis.read(bys)) != -1) {
fos.write(bys, 0, len);
}
// 释放资源
fis.close();
fos.close();
}
//方法三:字节缓冲流一次读写一个字节
public static void time3() throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\我的文档鸭\\图片素材\\意气风发正少年.mp4"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\yangzhou\\后端关卡8-16\\关卡14_文件IO流\\02_字节流\\作业\\Homework\\是羡羡鸭.mp4"));
//读写数据,复制图片(一次读取一个字节,一次写入一个字节)
int by;
while ((by = bis.read()) != -1) {
bos.write(by);
}
// 释放资源
bos.close();
bis.close();
}
//方法四:字节缓冲流一次读写一个字节数组
public static void time4() throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\我的文档鸭\\图片素材\\意气风发正少年.mp4"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\yangzhou\\后端关卡8-16\\关卡14_文件IO流\\02_字节流\\作业\\Homework\\是羡羡鸭.mp4"));
//读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
byte[] bys = new byte[1024];
int len;
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
}
// 释放资源
bos.close();
bis.close();
}
}
package com.B.IOStream_14.IODemo;
import java.io.*;
//11:02长,37.5MB大的视频
//1.分别使用字节流和字节缓冲流,实现文本文件/图片/视频文件的复制。
// 并比较二者在数据复制方面的效率(提示:日期类)
public class A1Copyavi {
public static void main(String[] args) throws IOException {
//记录开始时间
long startTime1 = System.currentTimeMillis();
// 复制视频
//调用方法一:
time1();
System.out.println("方法一:字节流复制视频的时常计算(一次读写一个字节)");
// 记录结束时间
long endTime1 = System.currentTimeMillis();
System.out.println("共耗时:" + (endTime1 - startTime1) + "毫秒");
System.out.println("-----------");
// 调用方法二:
long startTime2 = System.currentTimeMillis();
time2();
System.out.println(" 方法二:字节流复制视频的时常计算(一次读写一个字节数组)");
long endTime2 = System.currentTimeMillis();
System.out.println("共耗时:" + (endTime2 - startTime2) + "毫秒");
System.out.println("-----------");
// 调用方法三:
long startTime3 = System.currentTimeMillis();
time3();
System.out.println("方法三:字节缓冲流一次读写一个字节");
long endTime3 = System.currentTimeMillis();
System.out.println("共耗时:" + (endTime3 - startTime3) + "毫秒");
System.out.println("-----------");
// 调用方法四:
long startTime4 = System.currentTimeMillis();
time4();
System.out.println("方法四:字节缓冲流一次读写一个字节数组");
long endTime4 = System.currentTimeMillis();
System.out.println("共耗时:" + (endTime4 - startTime4) + "毫秒");
}
// 方法一:字节流复制视频的时常计算(一次读写一个字节)
public static void time1() throws IOException {
// 根据数据源创建字节输入流对象
FileInputStream fis = new FileInputStream("E:\\yangzhou\\后端关卡8-16\\关卡14_文件IO流\\02_字节流\\视频\\18_字节流复制视频.avi");
//根据目的地创建字节输出流对象
FileOutputStream fos = new FileOutputStream("E:\\yangzhou\\后端关卡8-16\\关卡14_文件IO流\\02_字节流\\作业\\Homework\\教我字节流复制.avi");
//读写数据,复制图片(一次读取一个字节,一次写入一个字节)
int by;
while ((by = fis.read()) != -1) {
fos.write(by);
}
// 释放资源
fis.close();
fos.close();
}
// 方法二:字节流复制视频的时常计算(一次读写一个字节数组)
public static void time2() throws IOException {
// 根据数据源创建字节输入流对象
// 根据数据源创建字节输入流对象
FileInputStream fis = new FileInputStream("E:\\yangzhou\\后端关卡8-16\\关卡14_文件IO流\\02_字节流\\视频\\18_字节流复制视频.avi");
//根据目的地创建字节输出流对象
FileOutputStream fos = new FileOutputStream("E:\\yangzhou\\后端关卡8-16\\关卡14_文件IO流\\02_字节流\\作业\\Homework\\教我字节流复制.avi");
//读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
byte[] bys = new byte[1024];
int len;
while ((len = fis.read(bys)) != -1) {
fos.write(bys, 0, len);
}
// 释放资源
fis.close();
fos.close();
}
//方法三:字节缓冲流一次读写一个字节
public static void time3() throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\yangzhou\\后端关卡8-16\\关卡14_文件IO流\\02_字节流\\视频\\18_字节流复制视频.avi"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\yangzhou\\后端关卡8-16\\关卡14_文件IO流\\02_字节流\\作业\\Homework\\教我字节流复制.avi"));
//读写数据,复制图片(一次读取一个字节,一次写入一个字节)
int by;
while ((by = bis.read()) != -1) {
bos.write(by);
}
// 释放资源
bos.close();
bis.close();
}
//方法四:字节缓冲流一次读写一个字节数组
public static void time4() throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\yangzhou\\后端关卡8-16\\关卡14_文件IO流\\02_字节流\\视频\\18_字节流复制视频.avi"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\yangzhou\\后端关卡8-16\\关卡14_文件IO流\\02_字节流\\作业\\Homework\\教我字节流复制.avi"));
//读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
byte[] bys = new byte[1024];
int len;
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
}
// 释放资源
bos.close();
bis.close();
}
}