java.nio.ByteBuffer#duplicate()
返回共享舊緩衝區內容的新字節緩衝區。舊緩衝區內容的更改將在新緩衝區中可見,反之亦然。如果我想要一個字節緩衝區的深層副本,該怎麼辦?Java的ByteBuffer的深拷貝重複()
20
A
回答
1
您需要迭代整個緩衝區並按值複製到新緩衝區中。
35
我認爲深拷貝不需要涉及byte[]
。請嘗試以下操作:基於關mingfai解決方案的
public static ByteBuffer clone(ByteBuffer original) {
ByteBuffer clone = ByteBuffer.allocate(original.capacity());
original.rewind();//copy from the beginning
clone.put(original);
original.rewind();
clone.flip();
return clone;
}
2
:
這會給你一個幾乎真實的深層複製。唯一失去的將是標記。如果orig是HeapBuffer,並且偏移量不爲零或者容量小於後備數組,則不會複製遠端數據。
public static ByteBuffer deepCopy(ByteBuffer orig)
{
int pos = orig.position(), lim = orig.limit();
try
{
orig.position(0).limit(orig.capacity()); // set range to entire buffer
ByteBuffer toReturn = deepCopyVisible(orig); // deep copy range
toReturn.position(pos).limit(lim); // set range to original
return toReturn;
}
finally // do in finally in case something goes wrong we don't bork the orig
{
orig.position(pos).limit(lim); // restore original
}
}
public static ByteBuffer deepCopyVisible(ByteBuffer orig)
{
int pos = orig.position();
try
{
ByteBuffer toReturn;
// try to maintain implementation to keep performance
if(orig.isDirect())
toReturn = ByteBuffer.allocateDirect(orig.remaining());
else
toReturn = ByteBuffer.allocate(orig.remaining());
toReturn.put(orig);
toReturn.order(orig.order());
return (ByteBuffer) toReturn.position(0);
}
finally
{
orig.position(pos);
}
}
15
由於這個問題仍然出現作爲第一命中一個複製ByteBuffer
,我會提供我的解決方案。此解決方案不會觸及原始緩衝區(包括任何標記集),並會返回具有與原始相同容量的深層副本。
public static ByteBuffer cloneByteBuffer(final ByteBuffer original) {
// Create clone with same capacity as original.
final ByteBuffer clone = (original.isDirect()) ?
ByteBuffer.allocateDirect(original.capacity()) :
ByteBuffer.allocate(original.capacity());
// Create a read-only copy of the original.
// This allows reading from the original without modifying it.
final ByteBuffer readOnlyCopy = original.asReadOnlyBuffer();
// Flip and read from the original.
readOnlyCopy.flip();
clone.put(readOnlyCopy);
return clone;
}
如果一個關心的位置,限制,或爲了設置的原來一樣的,那麼這是一個簡單的除上述:
clone.position(original.position());
clone.limit(original.limit());
clone.order(original.order());
return clone;
2
一種更簡單的解決方案
public ByteBuffer deepCopy(ByteBuffer source, ByteBuffer target) {
int sourceP = source.position();
int sourceL = source.limit();
if (null == target) {
target = ByteBuffer.allocate(source.remaining());
}
target.put(source);
target.flip();
source.position(sourceP);
source.limit(sourceL);
return target;
}
相關問題
- 1. java的深拷貝
- 2. 淺拷貝或深拷貝?
- 3. java克隆深拷貝HashMap
- 4. Java ArrayList的拷貝構造函數是淺拷貝還是深拷貝?
- 5. 深拷貝
- 6. 深拷貝userControl
- 7. Java的克隆 - 深拷貝和淺拷貝
- 8. JAVA的ArrayList <Arraylist>的深拷貝
- 9. 淺拷貝和深拷貝在C
- 10. 淺拷貝和深拷貝示例
- 11. 深拷貝在Python
- 12. 深拷貝(鏈表)
- 13. DPDK mbuf深拷貝
- 14. NSManagedObjects深拷貝NSMutableArray
- 15. 深拷貝在Python
- 16. 深拷貝ASP.NET GridView
- 17. 結構深拷貝
- 18. python中的深拷貝
- 19. React中的深層拷貝
- 20. C#對象的深拷貝
- 21. std :: map的淺/深拷貝
- 22. 深拷貝的對象
- 23. JPA實體的深拷貝
- 24. 如何克隆(深層拷貝)java linkList
- 25. 爲什麼懶的拷貝時我們有深拷貝和淺拷貝?
- 26. 懶惰的拷貝 - 如何從淺拷貝創建深層拷貝
- 27. 淺拷貝和深深的對象C複製
- 28. 使用追加方法的Python淺拷貝和深拷貝
- 29. JavaScript深拷貝使用JSON
- 30. Groovy深拷貝JSON映射
有一個(可選的)「put」方法的重載,它可以爲你做到這一點。 – nos 2010-07-29 21:08:02
嗚呼!我學到了一些新東西。 – Kylar 2010-07-29 22:11:25