从运行结果上来看,缓冲流的效率远大于节点流,缓冲流默认是一次将1024*8个字节从磁盘写入缓冲文件中,程序从文件中一个字节一个字节的读取,这样比节点流从磁盘中一个字节一个字节的读取快很多。
eg:test1()和test2()进行比较
对于某些情况来说:可以再创建一个小的缓存区,让他们不是一个字节一个字节的读取,而是以指定大小的字节读取,这就减少了他们的访问次数,提高了效率。
eg:test1()和test3()进行比较
test2()和test4()进行比较
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class CompareDemo {
public static void main(String[] args) throws Exception {
File srcFile=new File("a.mp3");
File destFile=new File("b.mp3");
test1(srcFile,destFile);
test2(srcFile,destFile);
test3(srcFile,destFile);
test4(srcFile,destFile);
}
//使用节点流,从磁盘中一个字节一个字节的读写:16932ms
private static void test1(File srcFile, File destFile) throws Exception {
//复制开始时间
long begin=System.currentTimeMillis();
InputStream in=new FileInputStream(srcFile);
OutputStream out=new FileOutputStream(destFile);
int len=-1;
while((len=in.read())!=-1){
out.write(len);
}
out.close();
in.close();
System.out.println(System.currentTimeMillis()-begin);
}
//=============================================
//使用缓冲流,从内存文件中一个字节一个字节的读写:401ms
private static void test2(File srcFile, File destFile) throws Exception {
//复制开始时间
long begin=System.currentTimeMillis();
InputStream in=new BufferedInputStream(new FileInputStream(srcFile));
OutputStream out=new BufferedOutputStream(new FileOutputStream(destFile));
int len=-1;
while((len=in.read())!=-1){
out.write(len);
}
out.close();
in.close();
System.out.println(System.currentTimeMillis()-begin);
}
//===========================================
//使用节点流,从磁盘中每次读写1024个字节:32ms
private static void test3(File srcFile, File destFile) throws Exception {
//复制开始时间
long begin=System.currentTimeMillis();
InputStream in=new FileInputStream(srcFile);
OutputStream out=new FileOutputStream(destFile);
//创建1024个字节的缓冲区
byte[]b=new byte[1024];
int len=-1;
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
out.close();
in.close();
System.out.println(System.currentTimeMillis()-begin);
}
//===============================================
//使用缓冲流,从内存文件中每次读写1024个字节:17ms
private static void test4(File srcFile, File destFile) throws Exception {
//复制开始时间
long begin = System.currentTimeMillis();
InputStream in = new BufferedInputStream(new FileInputStream(srcFile));
OutputStream out = new BufferedOutputStream(new FileOutputStream(destFile));
//创建1024个字节的缓冲区
byte[]b=new byte[1024];
int len=-1;
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
out.close();
in.close();
System.out.println(System.currentTimeMillis() - begin);
}
}