java - 扩展 Java 内存映射字节缓冲区

标签 java expand memory-mapped-files

有没有办法扩展 Java 内存映射字节缓冲区,以便将新大小反射(reflect)回磁盘上的映射文件?

最佳答案

不,您需要调整底层文件的大小并重新创建内存映射字节缓冲区。

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 在超出文件末尾的特定位置写入文件(使用 map.position() 或 map.putX(position, ...)),这些值将附加到文件末尾文件并没有写在你期望的位置(至少在 linux 上)。如果这是不受欢迎的行为,您将需要将数据附加到文件中才能真正增大文件。

关于java - 扩展 Java 内存映射字节缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3028522/

相关文章:

html - 展开/折叠图像

java - Spring外键无限循环

java - 在 Android 应用程序中实现客户端 <-> 服务器 <-> 数据库架构的最佳方式?

java - JPercientTree(JTree,boundtree)将路径扩展到给定节点

android - ExpandableListView 仅在特定 Button 上展开?

c++ - Eigen 和巨大的密集二维阵列

c++ - 在boost中只写内存映射?

c++ - 跨进程内存屏障

java - 如何解决 for 循环中的局部引用变量?

java - ResultSetImpl.checkColumnBounds 或 ResultSetImpl.getStringInternal 中偶尔出现 NullPointerException