java.nio.ByteBuffer#duplicate()
devuelve un nuevo búfer de bytes que comparte el contenido del búfer antiguo. Los cambios en el contenido del viejo buffer serán visibles en el nuevo buffer, y viceversa. ¿Qué pasa si quiero una copia profunda del buffer de byte?Copia profunda duplicada() de ByteBuffer de Java
Respuesta
Tendrá que iterar todo el almacenamiento intermedio y copiar por valor en el nuevo almacenamiento intermedio.
Creo que la copia profunda no necesita involucrar a byte[]
. Pruebe lo siguiente:
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;
}
¿Por qué necesito voltear el clon? Entonces el límite es más bajo que mi capacidad real – Karussell
¡GUAU! Eso fue útil. ¡Gracias! –
Lo único que no se copia en este caso es la marca, así que tenga en cuenta que si usa la marca, se perderá. Además, esta función solo copia desde el principio hasta el límite y la posición del original se pierde; sugiero que se establezca position = 0 y limit = capacity y que se almacenen como temps temporales para restablecer en el original y clonar antes de regresar. También rebobinar descarta la marca, por lo que usar eso probablemente no sea una buena idea. Voy a publicar una respuesta con un método más completo. – LINEMAN78
base fuera de la solución de mingfai:
Esto le dará una copia casi verdad profunda. Lo único perdido será la marca. Si orig es un HeapBuffer y el desplazamiento no es cero o la capacidad es inferior a la matriz de respaldo que los datos periféricos no se copian.
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);
}
}
Como esta pregunta todavía aparece como uno de los primeros éxitos de la copia de un ByteBuffer
, ofreceré mi solución. Esta solución no toca el búfer original, incluido ningún conjunto de marcas, y devolverá una copia profunda con la misma capacidad que el original.
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;
}
Si uno se preocupa por la posición, límite, o con el fin de ajustar el mismo que el original, entonces eso es una adición fácil de lo anterior:
clone.position(original.position());
clone.limit(original.limit());
clone.order(original.order());
return clone;
Uno más solución simple
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. Copia de estructura profunda
- 2. copia profunda vs copia superficial
- 3. copia profunda en C#
- 4. Copia profunda en JPA
- 5. BeanUtils.cloneBean() copia profunda
- 6. Cómo hacer una copia profunda de un InputStream en Java
- 7. argumentos de multiprocesamiento de python: ¿copia profunda?
- 8. ¿Hace Enumerable.Repeat() una copia profunda?
- 9. Copia profunda de un objeto C#
- 10. Copia profunda de matrices en Ruby
- 11. C++ equivalente de Java ByteBuffer?
- 12. Problema de rendimiento de Java ByteBuffer
- 13. Ayuda con copia y copia profunda en Python
- 14. ¿SqlCommand.Clone() crea una copia profunda o una copia superficial?
- 15. Crear una copia profunda en C#
- 16. Enhebrado trenzado cómo evitar la copia profunda
- 17. std vector C++ - copia profunda o superficial
- 18. Java/Android - Fast ByteBuffer Parsing
- 19. Copia profunda de nodos de vista de árbol
- 20. C++: Copia profunda de un puntero de clase base
- 21. Copia profunda de una instancia de clase .NET sin serialización
- 22. comparar contenido de ByteBuffer?
- 23. ¿El método de clonación en la matriz es una copia profunda o poco profunda?
- 24. ¿Cómo hacer una copia profunda de una matriz?
- 25. Cómo hacer una copia profunda de NSManagedObject en Core Data
- 26. C: Haciendo una copia profunda de una estructura ... haciendo una copia superficial de una estructura
- 27. Manipulación de ByteBuffer de JNI
- 28. ¿Cómo hago una copia profunda de una matriz 2D en Java?
- 29. ¿Cómo se hace una copia profunda de un objeto en Java?
- 30. Borrado de un ByteBuffer
Hay una sobrecarga (opcional) del método 'put' que hace esto por usted. – nos
Woohoo! Aprendí algo nuevo. – Kylar