首先 ,查阅手册得知 BufferedOutputStream 有如下
其实 在利用BufferedOutstream 写字节数组到此缓冲输出流的时候,是当缓冲区满了之后 才进行一次写操作,有些 人对 flush也 是 表面的 理解,
刷新 其实 一般放在最后一次写操作之后,若此时 缓冲区 还有数据,但是还未满,强制 写到输出流中。
下面用代码 解释
public class CopyByBufferedStream {
public static void main(String[] args) {
try {
FileInputStream fis=new FileInputStream("1.flv");
BufferedInputStream bis=new BufferedInputStream(fis);
FileOutputStream fos=new FileOutputStream("1_new.flv");
BufferedOutputStream bos= new BufferedOutputStream(fos);
byte[] input=new byte[100];
long count = 0;
long before=System.currentTimeMillis();
while(bis.read(input)!=-1){
count++;
bos.write(input);
//bos.flush();
}
System.out.println(count);
System.out.println((System.currentTimeMillis()-before)+"ms");
bis.close();
fis.close();
bos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class CopyByByteStream {
public static void main(String[] args){
try {
FileInputStream fis=new FileInputStream("1.flv");
FileOutputStream fos=new FileOutputStream("1_new.flv");
byte input[]=new byte[100];
long count=0;
long before =System.currentTimeMillis();
try {
while(fis.read(input)!=-1){
fos.write(input);
count++;
}
fis.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(count+"\n"+(System.currentTimeMillis()-before)+"ms");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
运行后的结果 如下图
其实 我的这个计数器 count 虽然是 一样的 但是 对于有Buffer 的 流来说 ,其正真的io次数 是远远小于 71198的 。这儿有个方法让 BufferOutputstream 失效,就是 每次写之后,强制 flush一下,这样 其实 没有达到 缓冲的目的 。运行时间 也就和普通的 在一个数量级上。(7198是这么来的:文件大小/100byte)
正常的话 听到这儿 你应该明白了!