【Java】I/O流之效率PK:字节流 VS 字节缓冲流

本文通过复制118M视频文件的实验,对比了Java中基本字节流与字节缓冲流的性能差异。结果显示,在相同条件下,字节缓冲流的读写速度远超基本字节流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、方案设计

二、方案实施

1. 字节流一次读写一个字节

2. 字节流一次读写一个字节数组

3. 字节缓冲流一次读取一个字节

4. 字节缓冲流一次读取一个字节数组

三、结果分析


        通过前面的学习我们已经学习了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倍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离陌lm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值