java.nio.ByteBuffer#duplicate()
возвращает новый байтовый буфер, который разделяет содержимое старого буфера. Изменения в содержимом старого буфера будут видны в новом буфере и наоборот. Что делать, если я хочу получить глубокую копию байтового буфера?Глубокая копия() Java ByteBuffer
ответ
Вам нужно будет перебрать весь буфер и скопировать по значению в новый буфер.
Я думаю, что глубокая копия не обязательно должна включать byte[]
. Попробуйте следующее:
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;
}
Почему мне нужно перевернуть клон? Тогда предел ниже моей реальной емкости – Karussell
WOW! Это было полезно. –
Единственное, что не копируется в этом случае, это знак, поэтому просто знайте, что если вы используете знак, он будет потерян. Кроме того, эта функция только копирует от начала до предела, а позиция оригинала теряется, я бы предложил установить положение = 0 и limit = емкость и сохранить их как временные вары, которые будут сброшены на оригинал и клон перед возвратом. Кроме того, перемотка назад отбрасывает метку, поэтому использование, вероятно, не очень хорошая идея. Я отправлю ответ с более полным методом. – LINEMAN78
Основы раствора mingfai в:
Это даст вам почти настоящую глубокую копию. Единственное, что потеряно, - это знак. Если 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);
}
}
Поскольку этот вопрос до сих пор приходит в качестве одного из первых хитов копирования 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;
Еще одно простое решение
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. Java Клонирование - глубокая копия и копия мелкой
- 3. Мелкая копия или глубокая копия?
- 4. Глубокая копия и мелкая копия
- 5. глубокая копия общего списка
- 6. ArrayList (полностью глубокая копия)
- 7. Глубокая копия двоичного дерева
- 8. Глубокая копия структуры графа
- 9. XSLT: глубокая дочерняя копия
- 10. Глубокая копия записи сущности
- 11. Глубокая копия массива объектов
- 12. Глубокая копия NSMutableDictionary
- 13. Глубокая копия объекта C#
- 14. глубокая копия ArrayList()
- 15. Глубокая копия панды панели?
- 16. Глубокая копия неизменяемого
- 17. Конкретно глубокая копия ломтик?
- 18. Глубокая копия CMSampleBufferRef
- 19. глубокая изменяемая копия NSMutableDictionary
- 20. Глубокая копия общего типа в Java
- 21. Глубокая копия объекта с матрицей (Java)
- 22. Глубокая копия при использовании ArrayList в java
- 23. Глубокая копия и возвращение экземпляра Java
- 24. Java глубокая копия - неправильная ссылка присвоение
- 25. Неверная копия и глубокая копия в C
- 26. Moxy: Эффективная глубокая копия JAXBElement
- 27. Основная глубокая копия (op overloading)
- 28. Глубокая копия списков пользовательских объектов
- 29. Ссылка, неглубокая и глубокая копия
- 30. Глубокая копия 3-мерная матрица
Существует (необязательная) перегрузка метода 'put', который делает это для вас. – nos
Woohoo! Я узнал что-то новое. – Kylar