FileOutputStream和BufferedInputStream效率

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;



public class InputStreamTest {
private static final String FILENAME = "D:\\a.zip";


public static void main(String[] args) throws IOException {
long l1 = readByBufferedInputStream();
long l2 = readByInputStream();
System.out.println("通过BufferedInputStream读取用时:" + l1
+ ";通过InputStream读取用时:" + l2);
}


public static long readByInputStream() throws IOException {
InputStream in = new FileInputStream(FILENAME);
FileOutputStream out = new FileOutputStream("d:/file1.zip");


byte[] b = new byte[1024];
long start = System.currentTimeMillis();
while (in.read(b, 0, b.length) != -1) {
out.write(b);
}


in.close();
out.close();
long end = System.currentTimeMillis();
return end - start;
}


public static long readByBufferedInputStream() throws IOException {
BufferedInputStream in = new BufferedInputStream(new FileInputStream(
FILENAME));
BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream("d:/file2.zip"));


byte[] b = new byte[1024];
long start = System.currentTimeMillis();
while (in.read(b, 0, b.length) != -1) {
out.write(b);
}


in.close();
out.close();
long end = System.currentTimeMillis();
return end - start;
}
}

输出结果:

通过BufferedInputStream读取用时:717;通过InputStream读取用时:3151

BufferedInputStream 有个内部缓冲区当read时会先把缓冲区填满,然后下次读取是直接从缓冲区读取。当读取的位置大于缓冲区时会再一次加载缓冲区。

缓冲原理:通过初始化分配一个byte数组,一次性从输入字节流中读取多个字节的数据放入byte数组,程序读取部分字节的时候直接从byte数组中获取,直到内存中的数据用完再重新从流中读取新的字节。

我们都知道文件的物理读取性能肯定要大于内存读取,FileInputStream.read()相当于一次一次的物理IO读取,而BufferedInputStream .read()大部分相当于一次内存读取。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值