Java字节数组到ByteBuffer或ByteBuffer到字节数组转换“没有复制”

时间:2015-06-26 00:26:09

标签: java java-native-interface nio

java数组上最大的问题是,它们需要复制才能编辑。 我正在使用AMD Aparapi,我从计算中得到字节数组。 我需要将字节数组显示为bytebuffer“不复制”

byte aparapiData[];
ByteBuffer buffer;
...
//here bytebuffer
buffer.clear();
buffer.put(aparapiData);
buffer.flip();

socket.write(buffer);

这里的代码问题,buffer.put是将字节数组复制到bytebuffer。 并且还有将字节数组转换为bytebuffer的反向问题。

他们真的需要复制数据吗? 我可以在不复制的情况下在C ++上发送纯数据。

我如何在Java上解决这个问题?

1 个答案:

答案 0 :(得分:7)

要获取指向现有字节数组的ByteBuffer,可以使用wrap函数:

byte[] array = /* something */;
ByteBuffer buffer = ByteBuffer.wrap(array);

要获取指向现有ByteBuffer的字节数组,可以使用array方法:

ByteBuffer buffer = /* something */;
byte[] array = buffer.array();

然而,请注意后者仅在ByteBuffer由数组支持时才有效(即如果hasArray返回true)。

缺乏对称性的原因是ByteBuffer可以以任何数量的不同方式实现。有时它实现为内存中的一个数组,但它很可能在查询时从磁盘或网络或其他来源读取数据。在这种情况下,您不能只访问底层数组,因为没有。