java輸入輸出專題--第三部分

java輸入輸出專題--第一部分中瞭解到對於讀取數據的效率而言,BufferedInputStream要比FileInputStream高效。可是這個結論不是一直成立的,代碼以下:java

private static void bufferedInputStreamTest() throws Exception {windows

FileInputStream in = new FileInputStream(new File("data"));緩存

BufferedInputStream bin = new BufferedInputStream(in);測試

byte[] buf = new byte[1024];spa

int readCount = -1;操作系統

long totalCount = 0;.net

long start = System.currentTimeMillis();blog

while ((readCount = bin.read(buf)) != -1) {內存

totalCount += readCount;get

}

long end = System.currentTimeMillis();

System.out.println("讀取:" + totalCount + "個字節,耗時:" + (end - start));

bin.close();

}

 

 

private static void inputStreamTest() throws Exception {

FileInputStream in = new FileInputStream(new File("data"));

byte[] buf = new byte[1024];

int readCount = -1;

long totalCount = 0;

long start = System.currentTimeMillis();

while ((readCount = in.read(buf)) != -1) {

totalCount += readCount;

}

long end = System.currentTimeMillis();

System.out.println("讀取:" + totalCount + "個字節,耗時:" + (end - start));

in.close();

}

 

 

請看測試結果:

一、當buf爲1024字節時

BufferedInputStream讀取:1073741824個字節,耗時:613

FileInputStream讀取:1073741824個字節,耗時:1804

二、當buf爲2048字節時

    BufferedInputStream讀取:1073741824個字節,耗時:625

FileInputStream讀取:1073741824個字節,耗時:1154

三、當buf爲4096字節時

 

BufferedInputStream讀取:1073741824個字節,耗時:640

FileInputStream讀取:1073741824個字節,耗時:770

四、當buf爲8192字節時

   BufferedInputStream讀取:1073741824個字節,耗時:549

FileInputStream讀取:1073741824個字節,耗時:569

五、當buf爲16384字節時

BufferedInputStream讀取:1073741824個字節,耗時:575

FileInputStream讀取:1073741824個字節,耗時:504

六、當buf爲32768字節時

BufferedInputStream讀取:1073741824個字節,耗時:398

FileInputStream讀取:1073741824個字節,耗時:396

 

因此最後的結論是當buf的大小逐漸增大的時候,它們之間的效率差別會愈來愈小;甚至當buf大小爲16384時FileInputStream的讀取效率還稍微高於BufferedInputStream。(該測試在windows8下進行)

緣由以下:windows操做系統對文件的管理是按照簇爲基本單位,本機的簇大小爲4096個字節(可經過chkdsk命令查看)。當buf大小小於4096時,FileInputStream至關於要對同一個簇屢次(4096/緩存區大小)讀取(對簇的讀取涉及到系統調用),而BufferedInputStream內部有一個默認8192個節點的緩衝區,當buf大小小於4096時,不會涉及到系統調用,而是直接從內存BUF裏面獲取數據。當buf大小大於4096時二者差別馬上減小,主要仍是由於對系統調用的次數至關!

相關文章
相關標籤/搜索