JAVA FileInputStream 與 BufferedInputStream讀取效率的比較
阿新 • • 發佈:2019-02-20
通過BufferedInputStream讀取用時:114;通過InputStream讀取用時:1283
網友的疑問是,為什麼我們用了buffer(BufferedInputStream )花的時間還比沒用的時候長?
首先我們關注他們的讀取:
in.read(b,0,8000)
in read(byte b[], int off, int len)
b[]-目標byte陣列
off 表示讀取的起始位置
len 表示要讀取的長度
在BufferedInputStream中:
byte[] buf,在讀取的時候,我們會優先檢查buf中的資料。這個buf的預設大小是8M
pos 表示上一次讀取的最後的位置
count表示buf中index的最後一位。buf的範圍在buf[0]-buf[count-1]之間
那麼:pos>=count,表示已經讀到buf的末尾,我們自動填充buf
否者:pos<count,我們從buf中讀取。
當我們一次讀取的資料len為8000的時候,他一次讀取的大小接近buf的總長度了(8192),幾乎此讀取BufferedInputStream都要重新填充一次buf,那還不如直接從檔案讀取效率高,因為還有填充一次buf再從buf讀取。
然後我們把len的大小都修改為128的時候,BufferedInputStream要讀取65次這樣的迴圈in.read(b,0,128)才會觸發一次fill()方法去填充buf.這樣才能提高效率。
這就是我理解的原因。
所以請不要把你要讀取的byte[]長度設定的和buf的快取區差不多大。任何東西都不是一定快和一定慢的。都是因情況而定的。