当前位置:网站首页>字节流习题遇到的问题及解决方法
字节流习题遇到的问题及解决方法
2022-07-26 12:02:00 【王小小鸭】
题干:
分别使用字节流和字节缓冲流,实现文本文件/图片/视频文件的复制。并比较二者在数据复制方面的效率(提示:日期类
试验过程和遇到的问题:
明明视频只有短短3秒,占用内存1.25MB,但是字节流复制视频的时常计算方法二(一次读写一个字节数组)却用了7854毫秒,有蹊跷,
后来检查得知

对于3秒1.25MB的视频,字节流复制速度如下:
方法一:字节流复制视频的时常计算(一次读写一个字节)
共耗时:7645毫秒
-----------
方法二:字节流复制视频的时常计算(一次读写一个字节数组)
共耗时:10毫秒
-----------
方法三:字节缓冲流一次读写一个字节
共耗时:26毫秒
-----------
方法四:字节缓冲流一次读写一个字节数组)
共耗时:30毫秒
进程已结束,退出代码 0
试着将视频大小扩大到20MB以上:

结果如下:
方法一:字节流复制视频的时常计算(一次读写一个字节)
共耗时:232989毫秒
-----------
方法二:字节流复制视频的时常计算(一次读写一个字节数组)
共耗时:299毫秒
-----------
方法三:字节缓冲流一次读写一个字节
共耗时:564毫秒
-----------
方法四:字节缓冲流一次读写一个字节数组)
共耗时:648毫秒
进程已结束,退出代码 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 - startTime2) + "毫秒");
System.out.println("-----------");
// 调用方法四:
long startTime4 = System.currentTimeMillis();
time4();
System.out.println("方法四:字节缓冲流一次读写一个字节数组)");
long endTime4 = System.currentTimeMillis();
System.out.println("共耗时:" + (endTime4 - startTime2) + "毫秒");
}
// 方法一:字节流复制视频的时常计算(一次读写一个字节)
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 - startTime2) + "毫秒");
System.out.println("-----------");
// 调用方法四:
long startTime4 = System.currentTimeMillis();
time4();
System.out.println("方法四:字节缓冲流一次读写一个字节数组");
long endTime4 = System.currentTimeMillis();
System.out.println("共耗时:" + (endTime4 - startTime2) + "毫秒");
}
// 方法一:字节流复制视频的时常计算(一次读写一个字节)
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();
}
}
边栏推荐
- Flutter 学习之路
- What is per title encoding?
- How do children's playgrounds operate?
- 剑指 Offer 24. 反转链表
- Network protocol: tcp/ip protocol
- 需不需要上线MES系统,你在纠结什么?
- The difference between JVM memory overflow and memory leak
- 儿童玩乐场所如何运营?
- Pytest interface automation test framework | pytest configuration file
- 空洞卷积详解(输入输出大小分析)
猜你喜欢

Live broadcast preview at 19:30 on July 27: harmonyos3 and Huawei's full scene new product launch

Audio and video+

Flink 在 讯飞 AI 营销业务的实时数据分析实践

使用fastJson中的JSONObject对象简化POST请求传参

儿童玩乐场所如何运营?

了解string类

Talking about web vitals

How much do you know about the two infrastructures of the badminton stadium?

程序员培训学习后好找工作吗?

pytest接口自动化测试框架 | pytest配置文件
随机推荐
Pytest interface automation test framework | setup and teardown functions of pytest
DS-24C/DC220V时间继电器
pytest接口自动化测试框架 | 使用装饰器修饰需要运行的用例
y9000p2022重装win10问题
PyCharm是真的强
Pytest interface automation test framework | pytest configuration file
Here blog: running a large language model in a production environment - overview of the reasoning framework
Pytest interface automated testing framework | confitest.py
基于 Flink CDC 实现海量数据的实时同步和转换
MySQL组合索引(多列索引)使用与优化
代码实例详解【可重入锁】和【不可重入锁】区别?
RFID的工作原理
pytest接口自动化测试框架 | pytest的setup和teardown函数
Li Kai: the interesting and cutting-edge audio and video industry has always attracted me
Introduction to FPGA (III) - 38 decoder
空洞卷积详解(输入输出大小分析)
Pytorch深度学习快速入门教程 -- 土堆教程笔记(一)
数智转型,管理先行|JNPF全力打造“全生命周期管理”平台
程序员培训学习后好找工作吗?
MATLAB中strjoin函数使用