Java MemoryMapping大文件

mar*_*ssi 4 java file-io memory-management nio memory-mapped-files

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));
}
Run Code Online (Sandbox Code Playgroud)

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

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

The*_*ist 6

你检查过dsiutil了ByteBufferInputStream吗?

的Javadoc

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

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

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

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