Java NIO - Pipe

In Java, NIO pipe è un componente che viene utilizzato per scrivere e leggere dati tra due thread. Il pipe consiste principalmente di due canali responsabili della propagazione dei dati.

Tra i due canali costituenti uno è chiamato canale Sink che è principalmente per la scrittura di dati e l'altro è il canale Source il cui scopo principale è leggere i dati dal canale Sink.

La sincronizzazione dei dati viene mantenuta in ordine durante la scrittura e la lettura dei dati in quanto è necessario garantire che i dati vengano letti nello stesso ordine in cui vengono scritti sul tubo.

Si deve tenere presente che si tratta di un flusso unidirezionale di dati in Pipe, ovvero i dati vengono scritti solo nel canale Sink e possono essere letti solo dal canale Sorgente.

In Java, NIO pipe è definita come una classe astratta con principalmente tre metodi di cui due astratti.

Metodi della classe Pipe

  • open() - Questo metodo viene utilizzato per ottenere un'istanza di Pipe oppure possiamo dire che pipe viene creato chiamando questo metodo.

  • sink() - Questo metodo restituisce il canale sink del pipe che viene utilizzato per scrivere dati chiamando il relativo metodo di scrittura.

  • source() - Questo metodo restituisce il canale di origine della pipe che viene utilizzato per leggere i dati chiamando il relativo metodo di lettura.

Esempio

Il seguente esempio mostra l'implementazione di Java NIO pipe.

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Pipe;

public class PipeDemo {
   public static void main(String[] args) throws IOException {
      //An instance of Pipe is created
      Pipe pipe = Pipe.open();
      // gets the pipe's sink channel
      Pipe.SinkChannel skChannel = pipe.sink();
      String testData = "Test Data to Check java NIO Channels Pipe.";
      ByteBuffer buffer = ByteBuffer.allocate(512);
      buffer.clear();
      buffer.put(testData.getBytes());
      buffer.flip();
      //write data into sink channel.
      while(buffer.hasRemaining()) {
         skChannel.write(buffer);
      }
      //gets  pipe's source channel
      Pipe.SourceChannel sourceChannel = pipe.source();
      buffer = ByteBuffer.allocate(512);
      //write data into console     
      while(sourceChannel.read(buffer) > 0){
         //limit is set to current position and position is set to zero
         buffer.flip();
         while(buffer.hasRemaining()){
            char ch = (char) buffer.get();
            System.out.print(ch);
         }
         //position is set to zero and limit is set to capacity to clear the buffer.
         buffer.clear();
      }
   }
}

Produzione

Test Data to Check java NIO Channels Pipe.

Supponendo di avere un file di testo c:/test.txt, che ha il seguente contenuto. Questo file verrà utilizzato come input per il nostro programma di esempio.