2011-01-26 105 views
1

FileInputStream上調用read(byte[])時,即使byte[]指數規模較大,讀取大小始終爲8k。增加由Java FileInputStream使用的內部緩衝區大小

你如何增加每次調用返回的最大讀取量?

請不要建議的方法,僅僅口罩FileInputStream的限制。


更新:似乎沒有成爲一個真正的解決了這一點。但是,我計算出我的系統上的方法調用開銷爲大約226uS,即1G文件。可以肯定的是,這不會以任何實際的方式影響性能。

+0

是否包括手動使用[的BufferedInputStream](http://www.docjar.com/docs/api/java/io/BufferedInputStream.html)? – 2011-01-26 04:12:32

回答

1

把它包在其中的BufferedInputStream允許你指定緩衝區的大小。

+0

這不僅僅是在while循環中包裝fileinputstream讀取方法嗎? – cmcginty 2011-01-26 03:51:55

+0

它會幫助底層FileInputStream每8k發出一個操作系統read()嗎?那麼,也許操作系統的I/O子系統將連續批量讀取幾次,但Java-to-OS調用的開銷仍然存在。 – 9000 2011-01-26 03:52:12

1

你可以嘗試內存映射使用NIO的文件,但我不知道有8K的問題是什麼。 您可以在8K複製到更大的陣列或使用返回的長度調用

public int read(byte[] b, 
       int off, 
       int len) 
     throws IOException 

隨着關是從最後一次讀取的返回值。

0

每個的大小看你看可能是由操作系統本身使用的緩衝區大小。因此,您可能必須在操作系統級別進行更改。你如何做到這一點將取決於系統。您可能能夠在創建文件系統時指定塊大小。傳統上,Unix文件系統可能是這樣。雖然具有諷刺意味的是,我相信這個特性曾經被用來預計有很多小文件的文件系統有更小的塊。