首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何有效地使用目标MappedByteBuffer?

如何有效地使用目标MappedByteBuffer?
EN

Stack Overflow用户
提问于 2017-03-22 08:11:35
回答 1查看 345关注 0票数 1

设置和问题

  • 我正在将一个文件转换为一个新文件,并且不知道输出缓冲区应该是多大的
    • 加密、编码、压缩等都具有这一特点。

  • 如果输出MappedByteBuffer太小,将引发java.nio.BufferOverflowException
  • 如果输出MappedByteBuffer太大,则结果文件将有尾随零。
  • 一个人如何自动增长一个MappedByteBuffer或切断尾随的零?

一个小例子

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

发布于 2017-03-22 09:18:19

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

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

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

例如:

代码语言:javascript
复制
Bytes bytes = MappedBytes.mappedFile(filename, 64 << 20); // 64 MB

注意:字节支持>2GB的块/文件,加密和压缩可能很有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42946012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档