【发布时间】:2010-06-12 11:40:32
【问题描述】:
有没有办法扩展 Java 内存映射字节缓冲区,以便将新大小反映回磁盘上的映射文件?
【问题讨论】:
标签: java expand memory-mapped-files
有没有办法扩展 Java 内存映射字节缓冲区,以便将新大小反映回磁盘上的映射文件?
【问题讨论】:
标签: java expand memory-mapped-files
不,您需要调整底层文件的大小并重新创建内存映射字节缓冲区。
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'ed 时才会取消映射。