「每日分享」内存文件映射方式读取超大文件踩坑题解析

我在这里,等风也等你

使用内存文件映射 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


分享到:


相關文章: