¿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

reseten su lugar.Respuestas:
Un caso de uso bastante común para el
ByteBufferes construir una estructura de datos pieza por pieza y luego escribir esa estructura completa en el disco.flipse usa para cambiarByteBufferde "lectura de E / S" (putting) a "escribir en I / O" (getting): después de queputse usa una secuencia de s para llenar elByteBuffer,flipestablecerá 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 futurogetowritedesde el búfer escriba todo lo que estabaputen el búfer y nada más.Después de terminar
put, es posible que desee reutilizarloByteBufferpara 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.clearrestablecer el límite a la capacidad y la posición a 0.Buffer.resetRestablecer 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:startyend.get()devuelve el byte en lastartposición y se incrementastart.put()coloca el byte en laendposició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