2015-06-26 30 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可以以任意數量的不同方式實現。有時它只是作爲內存中的一個數組來實現,但很有可能在查詢時可以從磁盤或網絡或其他來源讀取數據。在這種情況下,你不能只訪問底層數組,因爲沒有。

相關問題