Java NIO: tubería

En Java, la tubería NIO es un componente que se utiliza para escribir y leer datos entre dos subprocesos. La tubería consiste principalmente en dos canales que son responsables de la propagación de datos.

Entre los dos canales constituyentes, uno se denomina canal Sink, que es principalmente para escribir datos, y otro es el canal de origen, cuyo objetivo principal es leer datos del canal Sink.

La sincronización de datos se mantiene en orden durante la escritura y lectura de datos, ya que debe asegurarse de que los datos se lean en el mismo orden en que se escriben en la tubería.

Debe tener en cuenta que es un flujo de datos unidireccional en la tubería, es decir, los datos se escriben solo en el canal del sumidero y solo se pueden leer desde el canal de origen.

En Java, la tubería NIO se define como una clase abstracta con principalmente tres métodos, de los cuales dos son abstractos.

Métodos de la clase Pipe

  • open() - Este método se usa para obtener una instancia de Pipe o podemos decir que la tubería se crea llamando a este método.

  • sink() - Este método devuelve el canal sumidero de la tubería que se usa para escribir datos llamando a su método de escritura.

  • source() - Este método devuelve el canal de origen de Pipe que se usa para leer datos llamando a su método de lectura.

Ejemplo

El siguiente ejemplo muestra la implementación de la tubería Java NIO.

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

Salida

Test Data to Check java NIO Channels Pipe.

Asumiendo que tenemos un archivo de texto c:/test.txt, que tiene el siguiente contenido. Este archivo se utilizará como entrada para nuestro programa de ejemplo.