字节流实现文本文件/图片/视频文件的复制效率比较

60 篇文章 0 订阅

题干:

分别使用字节流和字节缓冲流,实现文本文件/图片/视频文件的复制。并比较二者在数据复制方面的效率(提示:日期类

试验过程和遇到的问题:

明明视频只有短短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();
        }


    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值