在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時二者差別馬上減小,主要仍是由於對系統調用的次數至關!