首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生长ByteBuffer

生长ByteBuffer
EN

Stack Overflow用户
提问于 2009-11-21 05:54:02
回答 11查看 50K关注 0票数 49

有没有人见过java.nio.ByteBuffer的实现会在putX()调用超出容量的情况下动态增长?

我想这样做的原因有两个:

  1. 我不知道提前需要多少空间。
  2. 我宁愿不做一个新的ByteBuffer.allocate(),而不是每次我耗尽空间时做一个大容量put()。
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-11-21 06:01:58

为了使异步I/O工作,您必须有连续的内存。在C语言中,您可以尝试重新分配数组,但在Java中,您必须分配新内存。您可以将其写入ByteArrayOutputStream,然后在准备发送时将其转换为ByteBuffer。缺点是您正在复制内存,而高效IO的关键之一是减少内存被复制的次数。

票数 44
EN

Stack Overflow用户

发布于 2009-11-21 16:52:00

ByteBuffer不可能以这种方式工作,因为它的设计概念只是一个特定数组的视图,您也可以直接引用它。它无法尝试将该数组替换为更大的数组,而不会发生奇怪的情况。

您想要使用的是DataOutput。最方便的方法是使用(预发行版)番石榴库:

代码语言:javascript
复制
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.write(someBytes);
out.writeInt(someInt);
// ...
return out.toByteArray();

但是,您也可以手动地从一个DataOutputStream创建一个ByteArrayOutputStream,只需将它们链接到AssertionErrors中来处理虚假的IOExceptions。

票数 11
EN

Stack Overflow用户

发布于 2009-11-21 08:25:17

看看Mina IOBuffer https://mina.apache.org/mina-project/userguide/ch8-iobuffer/ch8-iobuffer.html,这是一种替代品(它封装了ByteBuffer)。

然而,我建议你分配的比你需要的多,不要太担心它。如果您分配缓冲区(尤其是直接缓冲区),操作系统会给它提供虚拟内存,但它只在实际使用时才使用物理内存。虚拟内存应该非常便宜。

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

https://stackoverflow.com/questions/1774651

复制
相关文章

相似问题

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