2013-03-01 30 views
0

你知道java.nio.ByteBuffer的任何實現,它包裝一個ByteBuffer實例的數組,使它們看起來像單個實例,而不需要將字節複製到新的緩衝區中?ByteBuffer views

+1

'ByteBuffer'('Buffer')是固定大小的。不可能做出類似「連接」的事情。你真的想做什麼? – shuangwhywhy 2013-03-01 18:20:49

+0

我正在優化一些依賴於ByteBuffers的低級代碼,並且可以減少發生的字節副本數量。在字節緩衝區之間自然複製字節很簡單,但是由於nio框架已經發現;對於大量的字節反覆這樣做會增加。 – 2013-03-01 18:29:30

+0

爲什麼不一次創建一個大的'ByteBuffer'?或者只是使用數組。 – shuangwhywhy 2013-03-01 18:33:52

回答

3

java.nio中沒有實現,但幾乎所有通道都實現GatheringByteChannelScatteringByteChannel,它們可以直接讀取和寫入ByteBuffers數組。

GatheringByteChannel

long write(ByteBuffer[] srcs)

將字節序列從給定的緩衝區此通道。

ScatteringByteChannel

read(ByteBuffer[] dsts)

讀取字節的從此通道入給定緩衝區的序列。

上述方法也有部分版本,請參閱上面的鏈接。

NIO的目標是儘可能降低開銷,這種做法(而不是一個單獨的對象包裝緩衝區)不會產生比簡單數組更多的開銷。我認爲你是這個目標和它們的實現的預期用例。

+0

我知道最接近的是Netty內部的一個名爲Bytes的類,可惜他們並沒有擴展ByteBuffer來實現它。 Channel對我來說是錯誤的類,我想通過一個需要ByteBuffer(不是Channel)的庫來傳遞它。我已經通過複製字節來解決這個問題,但由於很多字節將流經此係統,所以發生的字節複製越少越好。不過謝謝你的想法。 – 2013-03-01 18:27:38

+1

爲什麼不分叉庫並擴展方法來允許一個「ByteBuffer」數組而不是僅僅一個'ByteBuffer'?我猜測正在讀寫的基礎'Channels'將支持上面的操作,並且您不需要改變幾行就可以使其工作。 – 2013-03-01 18:36:01

+0

這是一個有趣的想法,謝謝。我沒有考慮過它。我的直覺是,我需要更多時間才能做到這一點,而不僅僅是自己包裝ByteBuffer。但我會把它釘住,看看它在哪裏。如果他們確實有你期望的底層代碼,那麼我可能會很幸運。 – 2013-03-01 18:55:12

1

標準Java API中沒有人。 灰熊NIO框架有一個CompositeBuffer,但使用它自己的緩衝區包裝:

import org.glassfish.grizzly.Buffer; 
import org.glassfish.grizzly.memory.BuffersBuffer; 
import org.glassfish.grizzly.memory.CompositeBuffer;  

.... 

ByteBuffer byteBuffer = ....; 
HeapMemoryManager mm = new HeapMemoryManager(); 
CompositeBuffer buffer = BuffersBuffer.create(); 
Buffer b = mm.wrap(byteBuffer); 
buffer.append(b);