4

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[])),则需要重写大量代码。

问题:对于这类场景,您的最佳实践是什么,您是否知道任何可以在不重新发明轮子的情况下重复使用的有效解决方案/代码?

4

1 回答 1

6

你检查过 dsiutil 的ByteBufferInputStream吗?

Javadoc

这个类的主要用途是可以创建真正基于MappedByteBuffer.

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

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

那是你在想的吗? 它也是 LGPL

于 2011-04-29T13:03:11.293 回答