buffer allocate java
¿Cuál es el propósito del método flip de ByteBuffer?(¿Y por qué se llama "voltear"?) (3)
¿Por qué el método flip () de ByteBuffer se llama "flip"? ¿Qué es "volteado" aquí? De acuerdo con apidoc, dos volteos sucesivos no restaurarán el estado original, y los volteos múltiples tenderán probablemente a que el limit()
convierta en cero.
¿Puedo "unfliplip" de alguna manera reutilizar los bytes que salieron de un límite?
¿Puedo concatenar cola para voltear con algunos otros datos?
ByteBuffer está mal diseñado. Hay muchas quejas de programadores decentes.
Así que no intentes razonar sobre eso, solo estudia y usa la API cuidadosamente.
Ahora no puedo hablar mal sin presentar una alternativa, así que aquí está:
Un buffer tiene una capacity
fija; mantiene 2 punteros: start
y end
. get()
devuelve el byte en la posición start
e incrementa el start
. put()
pone el byte en la posición end
e incrementa el end
. Sin flip()
!
Flip asigna el valor de posición actual a la propiedad de límite y establece la propiedad de posición en 0. Flip es útil para drenar elementos activos de un búfer.
Por ejemplo, debajo del programa se imprime "hola" elementos no vacíos del búfer. El límite y la posición de las llamadas al método se pueden reemplazar por flip.
CharBuffer cbuff = CharBuffer.allocate(40);
cbuff.put("hello");
// what below two line of code is what flip does
cbuff.limit(cbuff.position());
cbuff.position(0);
while(cbuff.hasRemaining()) {
System.out.println(cbuff.get());
}
Consulte http://www.zoftino.com/java-nio-tutorial para obtener más información sobre buffers y canales.
Un caso de uso bastante común para ByteBuffer
es construir una estructura de datos pieza por pieza y luego escribir esa estructura completa en el disco. flip
se usa para cambiar el ByteBuffer
de "lectura de E / S" ( put
) a "escribir en E / S" ( get
): después de que una secuencia de put
se usa para llenar el ByteBuffer
, el flip
establecerá el límite de la memoria intermedia a la posición actual y restablecer la posición a cero. Esto tiene el efecto de hacer que un futuro get
o write
desde el búfer escriba todo lo que se put
en el búfer y nada más.
Después de terminar el put
, es posible que desee reutilizar el ByteBuffer
para construir otra estructura de datos. Para "desbloquearlo", llame a clear
. Esto restablece el límite de la capacidad (haciendo que todo el buffer sea utilizable) y la posición en 0.
Entonces, un escenario de uso típico:
ByteBuffer b = new ByteBuffer(1024);
for(int i=0; i<N; i++) {
b.clear();
b.put(header[i]);
b.put(data[i]);
b.flip();
out.write(b);
}