2013-10-23 90 views
0

爲什麼這不起作用?如何複製直接ByteBuffer的內容?

如果你檢查tt的支持數組,所有值都是0,而bb是1-100的順序 爲什麼system.out最後不一樣?

ByteBuffer bb = ByteBuffer.allocateDirect(100); 
for(int i =0;i< 100; i++) { 
    bb.put(new Byte(""+i)); 
} 
ByteBuffer tt = ByteBuffer.allocateDirect(100); 
tt.put(bb); 

for(int i =0;i< 100; i++) { 
     System.out.println("BACKED bb" + bb.get(i)); 
     System.out.println("BACKED tt" + tt.get(i)); 
} 
+2

你能解釋一下你的意思「不工作」?你期望它做什麼,它做什麼呢? – pburka

+0

你有例外嗎?什麼線? (爲什麼你將整數轉換爲字符串,解析爲字節,裝箱,然後取消裝箱,而不是寫入'bb.put((byte)i)'? –

+0

更新的問題,請參閱 – hunterp

回答

4

問題是put(byte)遞增的當前位置,所以當它試圖讀取bb到把結果放到tt,它從緩衝器的末端讀取。

做你想做什麼,你想要的東西,如:

ByteBuffer bb = ByteBuffer.allocateDirect(100); 
for(int i =0;i< 100; i++) { 
    bb.put((byte)i); 
} 
ByteBuffer tt = ByteBuffer.allocateDirect(100); 
// reset the position so that we can copy it to the new ByteBuffer. 
// Could also call bb.rewind() here. 
bb.position(0); 
tt.put(bb); 

for(int i =0;i< 100; i++) { 
     System.out.println("BACKED bb" + bb.get(i)); 
     System.out.println("BACKED tt" + tt.get(i)); 
} 

順便說一句,我稍微改變了創造,就沒有必要創建一個字符串來獲取字節值,只投了int直接寫入一個字節。

+0

好吧!那麼,建議? – hunterp

+1

@hunterp rewind()緩衝區。 – pburka

+0

位置(0)是正確的。 – hunterp

-2

你有沒有嘗試過這樣的:

bb.put((new Byte(""+i)).byteValue()); 
+0

這不是必須的,因爲自動裝箱會照顧那個對話離子爲你。 –

+0

事實上,字節類是完全不必要的。 'bb.put((byte)i);'應該就足夠了。 – pburka