allocate java buffer bytebuffer

buffer allocate java



¿Cuál es el uso de ByteBuffer en Java? (5)

En Android puede crear un búfer compartido entre C ++ y Java (con el método directAlloc) y manipularlo en ambos lados.

¿Cuáles son las aplicaciones de ejemplo para un ByteBuffer en Java? Por favor liste cualquier escenario de ejemplo donde esto es usado. ¡Gracias!


Java IO que utiliza API orientadas a la transmisión se realiza utilizando un almacenamiento intermedio como almacenamiento temporal de datos dentro del espacio del usuario. Los datos leídos del disco por DMA se copian primero a los almacenamientos intermedios en el espacio del kernel, que luego se transfiere al almacenamiento intermedio en el espacio del usuario. Por lo tanto, hay sobrecarga. Evitarlo puede lograr un aumento considerable en el rendimiento.

Podríamos omitir este búfer temporal en el espacio de usuario, si hubiera una manera directa de acceder al búfer en el espacio del kernel. Java NIO proporciona una forma de hacerlo.

ByteBuffer es uno de los varios búferes proporcionados por Java NIO. Es solo un contenedor o tanque de retención para leer o escribir datos en. El comportamiento anterior se logra asignando un búfer directo utilizando la API allocateDirect() en el búfer.

ByteBuffer


La clase ByteBuffer es importante porque forma una base para el uso de canales en Java. La clase ByteBuffer define seis categorías de operaciones en búfers de bytes:

  • Métodos get y put absolutos y relativos que leen y escriben bytes individuales;

  • Los métodos relativos de obtención masiva transfieren secuencias contiguas de bytes desde este búfer a una matriz;

  • Métodos relativos de puesta en masa que transfieren secuencias contiguas de bytes desde una matriz de bytes o algún otro búfer de bytes a este búfer;

  • Métodos get y put absolutos y relativos que leen y escriben valores de otros tipos primitivos, traduciéndolos a y desde secuencias de bytes en un orden de bytes particular;

  • Métodos para crear búferes de vista, que permiten que un búfer de bytes se vea como un búfer que contiene valores de algún otro tipo primitivo; y

  • Métodos para compacting , duplicating y slicing un búfer de bytes.

Example code : Putting Bytes into a buffer.

// Create an empty ByteBuffer with a 10 byte capacity ByteBuffer bbuf = ByteBuffer.allocate(10); // Get the buffer''s capacity int capacity = bbuf.capacity(); // 10 // Use the absolute put(int, byte). // This method does not affect the position. bbuf.put(0, (byte)0xFF); // position=0 // Set the position bbuf.position(5); // Use the relative put(byte) bbuf.put((byte)0xFF); // Get the new position int pos = bbuf.position(); // 6 // Get remaining byte count int rem = bbuf.remaining(); // 4 // Set the limit bbuf.limit(7); // remaining=1 // This convenience method sets the position to 0 bbuf.rewind(); // remaining=7


This es una buena descripción de sus usos y deficiencias. Básicamente lo usa cada vez que necesita hacer E / S rápidas de bajo nivel. Si fuera a implementar un protocolo TCP / IP o si estuviera escribiendo una base de datos (DBMS), esta clase sería útil.


Here hay un gran artículo que explica los beneficios de ByteBuffer. Los siguientes son los puntos clave en el artículo:

  • La primera ventaja de un ByteBuffer independientemente de si es directo o indirecto es el acceso aleatorio eficiente de datos binarios estructurados (por ejemplo, IO de bajo nivel como se indica en una de las respuestas). Antes de Java 1.4, para leer tales datos se podía usar un DataInputStream, pero sin acceso aleatorio.

Los siguientes son beneficios específicamente para ByteBuffer / MappedByteBuffer directo. Tenga en cuenta que los búferes directos se crean fuera del montón:

  1. No se ve afectado por los ciclos de gc : los búferes directos no se moverán durante los ciclos de recolección de basura ya que residen fuera del montón. La tecnología de caché BigMemory de TerraCota parece depender en gran medida de esta ventaja. Si estuvieran en montón, ralentizarían los tiempos de pausa de GC.

  2. Mejora del rendimiento : en la transmisión IO, las llamadas de lectura implicarían llamadas al sistema, que requieren un cambio de contexto entre el usuario y el modo kernel y viceversa, lo que sería costoso, especialmente si se accede constantemente al archivo. Sin embargo, con la asignación de memoria, este cambio de contexto se reduce ya que es más probable que se encuentren datos en la memoria (MappedByteBuffer). Si los datos están disponibles en la memoria, se accede directamente sin invocar el sistema operativo, es decir, sin cambio de contexto.

Tenga en cuenta que los MappedByteBuffers son muy útiles, especialmente si los archivos son grandes y se accede a algunos grupos de bloques con más frecuencia.

  1. Uso compartido de páginas : los archivos mapeados en memoria se pueden compartir entre procesos, ya que están asignados en el espacio de memoria virtual del proceso y pueden compartirse entre procesos.