有没有人见过java.nio.ByteBuffer的实现会在putX()调用超出容量的情况下动态增长?
我想这样做的原因有两个:
发布于 2009-11-21 06:01:58
为了使异步I/O工作,您必须有连续的内存。在C语言中,您可以尝试重新分配数组,但在Java中,您必须分配新内存。您可以将其写入ByteArrayOutputStream,然后在准备发送时将其转换为ByteBuffer。缺点是您正在复制内存,而高效IO的关键之一是减少内存被复制的次数。
发布于 2009-11-21 16:52:00
ByteBuffer不可能以这种方式工作,因为它的设计概念只是一个特定数组的视图,您也可以直接引用它。它无法尝试将该数组替换为更大的数组,而不会发生奇怪的情况。
您想要使用的是DataOutput。最方便的方法是使用(预发行版)番石榴库:
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.write(someBytes);
out.writeInt(someInt);
// ...
return out.toByteArray();但是,您也可以手动地从一个DataOutputStream创建一个ByteArrayOutputStream,只需将它们链接到AssertionErrors中来处理虚假的IOExceptions。
发布于 2009-11-21 08:25:17
看看Mina IOBuffer https://mina.apache.org/mina-project/userguide/ch8-iobuffer/ch8-iobuffer.html,这是一种替代品(它封装了ByteBuffer)。
然而,我建议你分配的比你需要的多,不要太担心它。如果您分配缓冲区(尤其是直接缓冲区),操作系统会给它提供虚拟内存,但它只在实际使用时才使用物理内存。虚拟内存应该非常便宜。
https://stackoverflow.com/questions/1774651
复制相似问题