最近,我創建了強制用戶界面實現單fromStream(OutputStream)
使用它的默認方法看起來像這樣:什麼讓文件讀取沒有緩衝區如此昂貴?
public default T fromFile(File file) throws IOException {
try (InputStream stream = new FileInputStream(file)) {
return fromStream(stream);
}
}
後不久事實證明,這是非常昂貴(每MB幾秒鐘)由於單字節被直接從FileInputStream
讀取。
將其包裝在BufferedInputStream
解決了我的問題,但它給我留下了爲什麼FileInputStream
是如此非常昂貴的問題。
文件頻道未關閉或讀取字節時打開,所以爲什麼有需要擺在首位的緩衝區?
那麼,一個非常差的操作系統可以這樣做,但每個具有Java實現的操作系統都具有內部OS文件系統緩存,用於緩衝磁盤中的數據塊,因此該塊將不會再被讀取。但即使從文件系統緩存中讀取,也需要系統調用,與處於用戶進程內部的任何內容相比,這會帶來很大的開銷。見Stephen的回答。 –