如何高效地从ByteBuf中获取一个短数组?

3
当使用 java.nio.ByteBuffer 时,我的代码如下:
ByteBuffer buffer = ...
ShortBuffer shortBuffer = buffer.asShortBuffer();
short[] shortArray = new short[shortBuffer .remaining()];
shortBuffer.get(shortArray);

现在使用Netty 4,如何高效地从ByteBuf获取短数组?或者我只是先使用ByteBuf.nioBuffer()获取一个ByteBuffer
另外,如何高效地将短数组放入ByteBuf中?我可以像这样编写代码吗:
Unpooled.buffer(...).nioBuffer().asShortBuffer().put(shortArray);
1个回答

3
Netty没有很好的机制从ByteBuf中提取Short[]。您可以使用一个复合解决方案,检测后端类型并使用不同的方式来处理这个后端,最终回退到简单地复制底层数组。
NioBuffer案例比较简单,它有一个简单的get()操作来读取结果short数组。
直接和基于数组的情况更难,这些情况要求我们调用readShort()循环直到填充结果数组。
最终代码将如下所示:
ByteBuf buf = ...;
short[] result;
if(buf.readableBytes() % 2 != 0) {
    throw new IllegalArgumentException();
}
result = new short[buf.readableBytes() / 2];
if (buf.nioBufferCount() > 0 ){
    buf.nioBuffer().asShortBuffer().get(result);
} else {
    for(int i = 0; i < result.length; i++) {
        result[i] = buf.readShort();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接