Java NIO: búfer

Los búferes en Java NIO se pueden tratar como un objeto simple que actúa como un contenedor de fragmentos de datos de tamaño fijo que se puede usar para escribir datos en el canal o leer datos del canal para que los búferes actúen como puntos finales de los canales.

Proporciona un conjunto de métodos que facilitan el manejo del bloque de memoria para leer y escribir datos hacia y desde canales.

Los búferes hacen que el paquete NIO sea más eficiente y rápido en comparación con el IO clásico, ya que en el caso de los datos IO se manejan en forma de flujos que no admiten el flujo de datos asíncrono y concurrente. Además, IO no permite la ejecución de datos en fragmentos o grupos de bytes .

Los parámetros primarios que definen el búfer NIO de Java se pueden definir como:

  • Capacity - Cantidad máxima de datos / byte que se pueden almacenar en el búfer. La capacidad de un búfer no se puede alterar. Una vez que el búfer está lleno, se debe borrar antes de escribir en él.

  • Limit - El límite tiene significado según el modo de búfer, es decir, en el modo de escritura, el límite de búfer es igual a la capacidad, lo que significa que el máximo de datos que se pueden escribir en el búfer, mientras que en el modo de lectura, el límite de búfer significa el límite de la cantidad de datos que se pueden escribir. leer desde el búfer.

  • Position - Apunta a la ubicación actual del cursor en el búfer. Inicialmente establecido como 0 en el momento de la creación del búfer o en otras palabras, es el índice del siguiente elemento a leer o escribir que se actualiza automáticamente mediante get () y put ( ) métodos.

  • Mark - Marcar un marcador de la posición en un búfer. Cuando se llama al método mark (), se registra la posición actual y cuando se llama a reset () se restaura la posición marcada.

Tipo de búfer

Los búferes de Java NIO se pueden clasificar en las siguientes variantes en función de los tipos de datos que maneja el búfer:

  • ByteBuffer
  • MappedByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

Métodos importantes de búfer

Como ya se mencionó, Buffer actúa como un objeto de memoria que proporciona un conjunto de métodos que hacen que sea más conveniente tratar con el bloque de memoria.Los siguientes son los métodos importantes de Buffer:

  • allocate(int capacity) - Este método se usa para asignar un nuevo búfer con capacidad como parámetro. El método de asignación arroja IllegalArgumentException en caso de que la capacidad pasada sea un entero negativo.

  • read() and put() - el método de lectura del canal se usa para escribir datos del canal al búfer, mientras que poner es un método de búfer que se usa para escribir datos en el búfer.

  • flip() - El método de inversión cambia el modo de búfer de escritura a lectura, también establece la posición de nuevo a 0 y establece el límite a donde estaba la posición en el momento de la escritura.

  • write() and get() - El método de escritura del canal se usa para escribir datos de un búfer a otro, mientras que get es un método de búfer que se usa para leer datos del búfer.

  • rewind() - El método de rebobinado se utiliza cuando es necesario volver a leer, ya que vuelve a poner la posición en cero y no altera el valor del límite.

  • clear() and compact() - Ambos métodos claros y compactos se utilizan para hacer que el búfer pase del modo de lectura al modo de escritura.clear() El método hace que la posición sea cero y el límite sea igual a la capacidad, en este método los datos en el búfer no se borran, solo se reinicializan los marcadores.

    Por otra parte compact() El método se usa cuando quedan algunos datos no leídos y aún usamos el modo de escritura del búfer en este caso, el método compacto copia todos los datos no leídos al principio del búfer y establece la posición justo después del último elemento no leído. ajustado a su capacidad.

  • mark() and reset() - Como el nombre sugiere, el método de marca se usa para marcar cualquier posición particular en un búfer mientras se restablece la posición de regreso a la posición marcada.

Ejemplo

El siguiente ejemplo muestra la implementación de los métodos definidos anteriormente.

import java.nio.ByteBuffer;
import java.nio.CharBuffer;

public class BufferDemo {
   public static void main (String [] args) {
      //allocate a character type buffer.
      CharBuffer buffer = CharBuffer.allocate(10);
      String text = "bufferDemo";
      System.out.println("Input text: " + text);
      for (int i = 0; i < text.length(); i++) {
         char c = text.charAt(i);
         //put character in buffer.
		 buffer.put(c);
      }
      int buffPos = buffer.position();
      System.out.println("Position after data is written into buffer: " + buffPos);
      buffer.flip();
      System.out.println("Reading buffer contents:");
      while (buffer.hasRemaining()) {
         System.out.println(buffer.get());                   
      }
      //set the position of buffer to 5.
      buffer.position(5);
      //sets this buffer's mark at its position
      buffer.mark();
      //try to change the position
      buffer.position(6);
      //calling reset method to restore to the position we marked.
      //reset() raise InvalidMarkException if either the new position is less
      //than the position marked or merk has not been setted.
      buffer.reset();
      System.out.println("Restored buffer position : " + buffer.position());
   }
}

Salida

Input text: bufferDemo
Position after data is written into buffer: 10
Reading buffer contents:
b
u
f
f
e
r
D
e
m
o
Restored buffer position : 5