1

您是否知道 java.nio.ByteBuffer 的任何实现,它包装了 ByteBuffer 实例数组,使它们看起来像单个实例,而无需将字节复制到新缓冲区中?

4

2 回答 2

5

java.nio 中不存在实现,但几乎所有通道都实现GatheringByteChannel并且ScatteringByteChannel可以直接读取和写入 ByteBuffers 数组。

GatheringByteChannel

long write(ByteBuffer[] srcs)

从给定的缓冲区将字节序列写入此通道。

ScatteringByteChannel

read(ByteBuffer[] dsts)

从此通道中读取一个字节序列到给定的缓冲区中。

上述方法也有部分版本,请参见上面的链接。

NIO 的重点是尽可能降低开销,并且这种方式(与使用单独的对象包装缓冲区相反)不会产生比简单数组更多的开销。我认为你的是这个及其实现的预期用例。

于 2013-03-01T18:24:05.577 回答
1

标准 Java API 中没有一个。Grizzly NIO 框架有一个 CompositeBuffer,但它使用它自己的缓冲区作为包装器:

import org.glassfish.grizzly.Buffer;
import org.glassfish.grizzly.memory.BuffersBuffer;
import org.glassfish.grizzly.memory.CompositeBuffer;    

....

ByteBuffer byteBuffer = ....;
HeapMemoryManager mm = new HeapMemoryManager();
CompositeBuffer buffer = BuffersBuffer.create();
Buffer b = mm.wrap(byteBuffer);
buffer.append(b);
于 2013-03-01T18:31:16.863 回答