不断增长的字节缓冲器

2022-08-31 22:09:53

有没有人见过java.nio.ByteBuffer的实现,如果putX()调用超过容量,它将动态增长?

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

  1. 我不知道我需要多少空间。
  2. 我宁愿不要做一个新的ByteBuffer.allocate(),然后在每次空间不足时做一个批量put()。

答案 1

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


答案 2

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

您要使用的是 .最方便的方法是使用(预发布)番石榴库:DataOutput

ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.write(someBytes);
out.writeInt(someInt);
// ...
return out.toByteArray();

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


推荐