2015-06-26 31 views
-1

对于java数组最大的问题,它们需要复制才能编辑。 我正在使用AMD Aparapi,我从我的计算中获取字节数组。 我需要展示的字节数组作为字节缓冲区“不复制”Java字节数组以ByteBuffer或ByteBuffer来进行字节数组转换“没有复制”

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

socket.write(buffer); 

这里的问题上的代码,buffer.put正在复制字节数组的ByteBuffer。 而且还有相反的问题将字节数组转换为bytebuffer。

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

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

+0

为什么不''socket.write(aparapiData)'? – immibis

+0

'byte aparapiData []'应该是'byte [] aparapiData';它是一个数组的事实是数据类型的一部分,而不是名称。 –

+0

Java数组不需要'复制来编辑'。没有人强迫你使用NIO频道。你真正的问题是什么? – EJP

回答

4

要获得一个指向现有的字节数组字节缓冲区,您可以使用wrap功能:

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

为了得到一个字节数组指向现有的ByteBuffer,您可以使用array方法:

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

然而,请注意,当字节缓冲区是由数组支持后者仅适用(即,如果hasArray返回true)。

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

相关问题