Java MemoryMapping大文件

MappedByteBuffer对2GIG的Java限制使得用于映射大文件变得棘手。 通常推荐的方法是使用MappedByteBuffer数组并通过以下方式对其进行索引:

long PAGE_SIZE = Integer.MAX_VALUE; MappedByteBuffer[] buffers; private int getPage(long offset) { return (int) (offset / PAGE_SIZE) } private int getIndex(long offset) { return (int) (offset % PAGE_SIZE); } public byte get(long offset) { return buffers[getPage(offset)].get(getIndex(offset)); } 

这可能适用于单个字节,但如果要处理更大且需要跨越边界的读/写(getLong()或get(byte [])),则需要重写大量代码。

问题是:对于这些场景,你最好的做法是什么,你知道任何可以重复使用的工作解决方案/代码而不重新发明轮子吗?

你检查过dsiutil的ByteBufferInputStream吗?

的Javadoc

这个类的主要用途是可以创建真正基于MappedByteBuffer输入流。

特别是,工厂方法map(FileChannel, FileChannel.MapMode)将整个文件内存映射到ByteBuffer数组中,并将该数组公开为ByteBufferInputStream。 这使得可以访问大于2GiB的容易映射的文件。

  • long length()
  • long position()
  • void position(long newPosition)

那是你想到的吗? 这也是LGPL 。