Java 字节数组到字节缓冲器或字节缓冲器到字节数组转换“无需复制”

2022-09-01 22:50:38

Java数组上最大的问题是,它们需要复制才能编辑。我正在使用AMD Aparapi,我从我的计算中获得字节数组。我需要将该字节数组显示为字节缓冲区“无需复制”

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

socket.write(buffer);

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

他们真的需要复制数据吗?我可以在C++上发送纯数据而无需复制。

如何在Java上解决此问题?


答案 1

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

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

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

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

但是,请注意,后者仅在字节缓冲区由数组支持时才有效(即如果 hasArray 返回 )。true

缺乏对称性的原因是字节缓冲器可以通过许多不同的方式实现。有时它只是作为内存中的数组实现的,但是当查询时,它很可能从磁盘或网络或其他源读取数据。在这种情况下,您不能只访问基础数组,因为没有基础数组。


答案 2

推荐