看注释:
import java.io.*;
public class IO_Test {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
long t1 = System.currentTimeMillis(); //获取开始时间
File f1 = new File("D:\\Rain.txt");
FileInputStream fis = new FileInputStream(f1);
BufferedInputStream bis = new BufferedInputStream(fis);
//BufferedInputStream本身带有缓存,所以受data数组的大小影响较小
//是把磁盘中的数据尽可能多的读入到buf中,buf和data的数据交换是在内存中
//内存的速度远大于磁盘,所以受数据交换次数的影响较小;
File f2 = new File("D:\\Receive.txt");
FileOutputStream fos = new FileOutputStream(f2);
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] data = new byte[1024];
//将data设置为100或10000000,最终时间相差无几
int len = bis.read(data);
while(len!=-1) {
// System.out.println(len);
bos.write(data, 0, len);
len = bis.read(data);
}
bos.flush();
fis.close();
bis.close();
fos.close();
bos.close();
long t2 = System.currentTimeMillis(); //获取结束时间
System.out.println(t2-t1); //时间差
}
}
分割线-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
import java.io.*;
public class IO_Test {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
long t1 = System.currentTimeMillis();
File f1 = new File("D:\\Rain.txt");
FileInputStream fis = new FileInputStream(f1);
File f2 = new File("D:\\Receive.txt");
FileOutputStream fos = new FileOutputStream(f2);
byte[] data = new byte[100];
//因为没有Buf流的缓冲,所以完成时间受data数组大小的影响较大
//当data数组比较小时,输入流要多次读取硬盘,硬盘等待时间较长,所以速度较慢
//当data数组比较大时,和带Buf流的速度相差无几,因为大的data就充当了Buf
//当data为100或1000000时,速度相差了3倍以上
int len = fis.read(data);
while(len != -1) {
// System.out.println(len);
fos.write(data, 0, len);
len = fis.read(data);
}
fos.flush();
fis.close();
fos.close();
long t2 = System.currentTimeMillis();
System.out.println(t2-t1);
}
}
分割线-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
另外,FileOutputStream在调用close()方法时会自动调用flush()方法,而BufferedOutputStream
不会,所以Buf流调用close()之前要先调用flush()清空缓冲区为避免记混,建议关闭流之前都先清空
一次。