¿Por qué el método flip () de ByteBuffer se llama "flip"? ¿Qué es "volteado" aquí? Según apidoc, dos giros sucesivos no restaurarán el estado original, y varios giros probablemente tenderán limit()
a convertirse en cero.
¿Puedo "deshacer" de alguna manera para reutilizar los bytes que se salieron de un límite?
¿Puedo concatenar la cola para voltearla con otros datos?
java
flip
bytebuffer
Suzan Cioc
fuente
fuente
reset
en su lugar.Respuestas:
Un caso de uso bastante común para el
ByteBuffer
es construir una estructura de datos pieza por pieza y luego escribir esa estructura completa en el disco.flip
se usa para cambiarByteBuffer
de "lectura de E / S" (put
ting) a "escribir en I / O" (get
ting): después de queput
se usa una secuencia de s para llenar elByteBuffer
,flip
establecerá el límite del búfer en la posición actual y restablezca la posición a cero. Esto tiene el efecto de hacer que un futuroget
owrite
desde el búfer escriba todo lo que estabaput
en el búfer y nada más.Después de terminar
put
, es posible que desee reutilizarloByteBuffer
para construir otra estructura de datos. Para "abrirlo", llameclear
. Esto restablece el límite de la capacidad (haciendo que todo el búfer sea utilizable) y la posición a 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); }
fuente
out
?write(ByteBuffer)
método. (No es realmente relevante cuál es su tipo ...)Buffer.clear
restablecer el límite a la capacidad y la posición a 0.Buffer.reset
Restablecer solo la posición amark
.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 solo elementos activos de un búfer.
Por ejemplo, el programa siguiente imprime "hola", no elementos vacíos del búfer. El límite y la posición de las llamadas al método se pueden reemplazar con 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 búferes y canales.
fuente
ByteBuffer está mal diseñado. Hay muchas quejas de programadores decentes.
Así que no intente razonar al respecto, solo estudie y use la API con cuidado.
Ahora no puedo hablar mal de él sin presentar una alternativa, así que aquí está:
Un búfer tiene un fijo
capacity
; mantiene 2 punteros:start
yend
.get()
devuelve el byte en lastart
posición y se incrementastart
.put()
coloca el byte en laend
posición y lo incrementaend
.flip()
¡ No !fuente
El método flip () prepara un búfer para una nueva secuencia de operaciones de escritura de canal o de obtención relativa: establece el límite en la posición actual y luego establece la posición en cero.
Buffer realiza un seguimiento de los datos escritos en él. Después de escribir, se llama al método flip () para cambiar del modo de escritura al modo de lectura.
fuente