如果已知一个ByteBuffer
是另一个缓冲区的子序列,是否有办法仅通过这两个ByteBuffer
对象获取直接ByteBuffer
零位置相对于另一个的位置?
我知道可以使用arrayOffset()
方法来处理非直接数组支持的ByteBuffer
,如下所示:
int getRelativeBufferOffset(ByteBuffer parentBuffer, ByteBuffer childBuffer)
{
return childBuffer.arrayOffset() - parentBuffer.arrayOffset();
}
void example()
{
ByteBuffer buffer1 = ByteBuffer.allocate(10000);
buffer1 .position(22);
ByteBuffer buffer2 = buffer1.slice();
buffer2.position(55);
ByteBuffer buffer3 = buffer2.slice();
// returns 22
getRelativeBufferOffset(buffer1, buffer2);
// returns 55
getRelativeBufferOffset(buffer2, buffer3);
// returns 77
getRelativeBufferOffset(buffer1, buffer3);
}
我认为没有免费的直接缓冲区存在。为了获得类似的东西,我能想到的最好的选择是扩展 ByteBuffer ,以存储对创建它(父缓冲区)的引用和相对于父缓冲区零位置创建时的零位置。
编辑:令人恼火的是,看起来我无法扩展 ByteBuffer ,因为它的构造函数都不可见。我想我必须编写某种包装类。
ByteBuffer
封装在RelativeByteBuffer
类中。不幸的是,Buffer
没有公开duplicate()
和slice()
方法,因此我无法像RelativeBuffer<T extends Buffer>
那样做一些巧妙的事情。 - PaddyD