2015-07-05 45 views
1

我正在学习Java I/O。因此,使用缓冲流将减少读取或写入所需的时间,因为如果使用普通的FileInputStream,每次读取被调用时都会获取一个字节,但如果使用缓冲区,则将获取指定大小的数据并将其存储在内存中。所以我试图在实践中看到这一点。为什么缓冲区大小对此文件读操作没有影响

package javaIO; 

import java.io.BufferedInputStream; 
import java.io.FileInputStream; 
import java.io.InputStream; 

public class BufferTest { 

    public static void main(String[] args) throws Exception{ 

     int starttime=(int) (System.currentTimeMillis()/1000); 

     BufferedInputStream is=new BufferedInputStream(new FileInputStream("/home/anil/Downloads/Vidoes/batman.mp4"),65536); 
//  InputStream is=new FileInputStream("/home/anil/Downloads/Vidoes/batman.mp4"); 
     int a=0; 
     while((a=is.read())!=-1){ 

      System.out.println(a); 
     } 

     is.close(); 

     int endTime=(int) (System.currentTimeMillis()/1000); 

     System.out.println("Took "+(endTime-starttime)+"seconds"); 
    } 

} 

我已经将BufferedInputStream的缓冲区大小设置为512,8192,65536。每次需要87秒才能完成执行。所以我尝试使用FileInputStream,并且仍然需要87秒来完成执行。 batman.mp4的大小是24.7mb。

那么我错过了什么?

  • 为什么缓冲区大小的改变对执行时间没有影响?
  • 为什么执行BufferedInputStream和FileInputStream的时间相同?

回答

2

什么让你慢下来是打印 - System.out.println(a); - 你总是在屏幕上打印24.7M字符。尝试将文件复制到另一个位置 - 使用不同的缓冲区大小读取它并将其重新写入新文件。

+0

此外,基准无效,因为它不允许缓存启动的效果。 – EJP

+0

我删除了打印语句。对于FileInputStream,花了9秒,对于BufferedInputStream花了0秒。 –

+0

@SrimanthDuggineni - 以“startTime”和“endTime”为单位除去千分之一以获得以mSec为单位的测量值,以获得更准确的时序。你也可以用'long'来代替'int'。 – TDG

相关问题