有没有办法扩展Java内存映射的字节缓冲区,使新的大小反映到磁盘上映射的文件中?
RandomAccessFile file = new RandomAccessFile(/* some file */);
MappedByteBuffer buffer = file.getChannel().map(MapMode.READ_WRITE, 0, file.length());
// Some stuff happens...
// adjust the size
file.setLength(newLength);
// recreate the memory mapped buffer
buffer = file.getChannel().map(MapMode.READ_WRITE, 0, file.length());
注意:设置文件长度会有一些奇怪的行为。如果您通过映射写入文件到超过文件末尾的特定位置(使用map.position()或map.putX(position, ...)),值将附加到文件的末尾,而不是按照您期望的位置进行写入(至少在Linux上如此)。如果这种行为不是所希望的,则需要向文件追加数据以真正扩大文件。
Channel
时可能会更少。所以我认为,调整MappedByteBuffer
的大小几次是可以的,但肯定不是在每次添加几个字节时都要调整。通常的问题是没有unmap
,当处理太多不同的文件时,你可能会用完文件描述符。只有当缓冲区被 GC 回收时,才会发生取消映射。 - maaartinus