Java NIO - Canales

Descripción

Como el nombre sugiere, el canal se usa como medio de flujo de datos de un extremo a otro. Aquí en java el canal NIO actúa igual entre el búfer y una entidad en el otro extremo, en otras palabras, el canal se usa para leer datos en el búfer y también escribir datos desde el búfer.

A diferencia de los flujos que se utilizan en Java, los canales IO convencionales son bidireccionales, es decir, pueden leer y escribir. El canal Java NIO admite el flujo de datos asíncrono tanto en modo de bloqueo como en modo de no bloqueo.

Implementaciones de Canal

El canal Java NIO se implementa principalmente en las siguientes clases:

  • FileChannel- Para leer datos de un archivo usamos el canal de archivos. El objeto del canal de archivo solo se puede crear llamando al método getChannel () en el objeto de archivo, ya que no podemos crear el objeto de archivo directamente.

  • DatagramChannel - El canal de datagramas puede leer y escribir los datos a través de la red a través de UDP (User Datagram Protocol). El objeto de DataGramchannel se puede crear usando métodos de fábrica.

  • SocketChannel- El canal SocketChannel puede leer y escribir datos en la red a través de TCP (Protocolo de control de transmisión). También utiliza los métodos de fábrica para crear el nuevo objeto.

  • ServerSocketChannel- El ServerSocketChannel lee y escribe los datos a través de conexiones TCP, al igual que un servidor web. Para cada conexión entrante se crea un SocketChannel.

Ejemplo

El siguiente ejemplo lee de un archivo de texto de C:/Test/temp.txt e imprime el contenido en la consola.

temp.txt

Hello World!

ChannelDemo.java

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class ChannelDemo {
   public static void main(String args[]) throws IOException {
      RandomAccessFile file = new RandomAccessFile("C:/Test/temp.txt", "r");
      FileChannel fileChannel = file.getChannel();
      ByteBuffer byteBuffer = ByteBuffer.allocate(512);
      while (fileChannel.read(byteBuffer) > 0) {
         // flip the buffer to prepare for get operation
         byteBuffer.flip();
         while (byteBuffer.hasRemaining()) {
            System.out.print((char) byteBuffer.get());
         }
      }
      file.close();
   }
}

Salida

Hello World!