Java 字节数组到 ByteBuffer 或 ByteBuffer 到 Byte 数组的转换"WITHOUT COPYING"



java数组最大的问题是,它们需要复制才能编辑。我使用的是AMD Aparapi,它是我从计算中得到的字节数组。我需要将字节数组显示为"不复制"的字节缓冲区

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

代码buffer.put的问题是将字节数组复制到字节缓冲区。同时,将字节数组转换为字节缓冲区也存在反向问题。

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

如何在Java上解决此问题?

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

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

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

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

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

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

最新更新