2015-07-05 36 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

相關問題