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()大部分相当于一次内存读取。