我在這裡,等風也等你
使用內存文件映射 MappedByteBuffer 讀超大文件會有什麼問題嗎?
這種方式存在一個致命問題就是依然沒法讀取超大文件(大於 Integer.MAX_VALUE),因為 FileChannel 的 map 方法中 size 參數會有大小限制,源碼中發現該參數值大於 Integer.MAX_VALUE 時會直接拋出 IllegalArgumentException("Size exceeds Integer.MAX_VALUE") 異常,所以對於特別大的文件其依然不適合。
本質上是由於 java.nio.MappedByteBuffer 直接繼承自 java.nio.ByteBuffer ,而ByteBuffer 的索引是 int 類型的,所以 MappedByteBuffer 也只能最大索引到 Integer.MAX_VALUE 的位置,所以 FileChannel 的 map 方法會做參數合法性檢查。
我們可以通過多個內存文件映射來解決這個問題,具體如下。
如上便是一種解決方案,其實質依然是分割。
想要源碼可以閱讀原文:https://mp.weixin.qq.com/s/JcnSOGKQlDgaTTFKZFbXnA?scene=25#wechat_redirect
閱讀更多 java全棧技術 的文章