Java NIO - Buffer

I buffer in Java NIO possono essere trattati come un oggetto semplice che agisce come un contenitore di dimensioni fisse di blocchi di dati che possono essere utilizzati per scrivere dati sul canale o leggere dati dal canale in modo che i buffer agiscano come endpoint per i canali.

Fornisce una serie di metodi che rendono più conveniente gestire il blocco di memoria per leggere e scrivere dati da e verso i canali.

I buffer rendono il pacchetto NIO più efficiente e veloce rispetto al classico IO poiché nel caso dei dati IO vengono trattati sotto forma di flussi che non supportano il flusso di dati asincrono e simultaneo. Inoltre IO non consente l'esecuzione dei dati in blocchi o gruppi di byte .

I parametri primari che definiscono il buffer Java NIO possono essere definiti come:

  • Capacity - Quantità massima di dati / byte che possono essere memorizzati nel Buffer. La capacità di un buffer non può essere modificata. Una volta che il buffer è pieno, dovrebbe essere cancellato prima di scrivere su di esso.

  • Limit - Il limite ha un significato in base alla modalità del buffer, ovvero in modalità di scrittura del buffer, il limite è uguale alla capacità, il che significa che i dati massimi che possono essere scritti nel buffer mentre in modalità di lettura del buffer, il limite indica il limite di quanti dati possono essere letto dal Buffer.

  • Position - Punta alla posizione corrente del cursore nel buffer Inizialmente impostato a 0 al momento della creazione del buffer o in altre parole è l'indice dell'elemento successivo da leggere o scrivere che viene aggiornato automaticamente da get () e put ( ) metodi.

  • Mark - Contrassegna un segnalibro della posizione in un buffer. Quando viene chiamato il metodo mark (), la posizione corrente viene registrata e quando viene chiamato reset () la posizione contrassegnata viene ripristinata.

Tipo di buffer

I buffer Java NIO possono essere classificati nelle seguenti varianti sulla base dei tipi di dati trattati dal buffer:

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

Metodi importanti di Buffer

Come già accennato, Buffer agisce come oggetto di memoria che fornisce una serie di metodi che rendono più conveniente gestire il blocco di memoria. Di seguito sono riportati i metodi importanti di Buffer -

  • allocate(int capacity) - Questo metodo viene utilizzato per allocare un nuovo buffer con capacità come parametro. Il metodo Allocate genera IllegalArgumentException nel caso in cui la capacità passata sia un numero intero negativo.

  • read() and put() - il metodo di lettura del canale viene utilizzato per scrivere i dati dal canale al buffer mentre put è un metodo di buffer che viene utilizzato per scrivere i dati nel buffer.

  • flip() - Il metodo Flip cambia la modalità del Buffer dalla modalità di scrittura a quella di lettura, inoltre riporta la posizione a 0 e imposta il limite a dove si trovava la posizione al momento della scrittura.

  • write() and get() - il metodo di scrittura del canale viene utilizzato per scrivere i dati dal buffer al canale mentre get è un metodo del buffer che viene utilizzato per leggere i dati dal buffer.

  • rewind() - il metodo rewind viene utilizzato quando è richiesta la rilettura in quanto riporta la posizione a zero e non altera il valore di limite.

  • clear() and compact() - chiari e compatti entrambi i metodi sono usati per rendere il buffer dalla modalità di lettura a quella di scrittura.clear() Il metodo rende la posizione a zero e il limite è uguale alla capacità, in questo metodo i dati nel buffer non vengono cancellati solo i marker vengono reinizializzati.

    D'altra parte compact() viene utilizzato quando sono rimasti alcuni dati non letti e ancora si usa la modalità di scrittura del buffer in questo caso il metodo compatto copia tutti i dati non letti all'inizio del buffer e imposta la posizione subito dopo l'ultimo elemento non letto. impostato sulla capacità.

  • mark() and reset() - Come suggerisce il nome, il metodo mark viene utilizzato per contrassegnare una posizione particolare in un buffer durante il ripristino, riportare la posizione alla posizione contrassegnata.

Esempio

L'esempio seguente mostra l'implementazione dei metodi sopra definiti.

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());
   }
}

Produzione

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