如何有效地使用目标MappedByteBuffer?

时间:2017-03-22 08:11:36

标签: java nio

设置和问题

  • 我正在将文件转换为新文件,并且不知道输出缓冲区应该有多大
    • 加密,编码,压缩等都具有此特性
  • 如果输出MappedByteBuffer太小,则会抛出java.nio.BufferOverflowException
  • 如果输出MappedByteBuffer太大,生成的文件将有尾随零

  • 如何自动增长MappedByteBuffer或删除尾随零?

一个小例子

FileChannel inChan  = FileChannel.open(Paths.get(inString),  StandardOpenOption.READ);
FileChannel outChan = FileChannel.open(Paths.get(outString), StandardOpenOption.READ, StandardOpenOption.CREATE, StandardOpenOption.WRITE);

MappedByteBuffer inMBB  =  inChan.map(MapMode.READ_ONLY,  0, inChan.size());

// The following will buffer overflow after the call to transform
MappedByteBuffer outMBB = outChan.map(MapMode.READ_WRITE, 0, 0);

// This will have trailing zeros after the call to transform
MappedByteBuffer outMBB = outChan.map(MapMode.READ_WRITE, 0, inChan.size() + 1024);

transform(inMBB, outMBB);

1 个答案:

答案 0 :(得分:0)

要创建不同大小的映射,您需要创建新的内存映射。这意味着要么创建更多映射并将它们拼接在一起,要么创建一个新的更大的映射,注意ByteBuffer的大小限制为Integer.MAX_VALUE。

我们开发了一个库MappedBytes,它可以按需增长(按照你定义的块大小),一旦你知道它是什么就可以截断文件长度。

https://github.com/OpenHFT/Chronicle-Bytes/blob/master/src/main/java/net/openhft/chronicle/bytes/MappedBytes.java

e.g。

Bytes bytes = MappedBytes.mappedFile(filename, 64 << 20); // 64 MB

注意:字节内置支持&gt;的块/文件。 2 GB,加密和压缩可能有用。