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

发布于 2024-09-05 13:53:11 字数 48 浏览 7 评论 0原文

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

Is there a way to expand the Java memory-mapped byte buffer such that the new size is reflected back to the mapped file on disk?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

轮廓§ 2024-09-12 13:53:20

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

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 上)。如果这是不需要的行为,您将需要将数据附加到文件中才能真正增大文件。

No, you will need to adjust the size of the underlying file and recreate the Memory Mapped Byte Buffer.

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());

Note: Setting the file length has some slightly odd behaviour. If you write to the file via the map at a specific position that is beyond the end of the file (either using map.position() or map.putX(position, ...)) the values will be appended to the end of the file and not written at the position you expect (on linux at least). If this is undesired behaviour you will need to append data to the file in order to truly grow the file.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文