Java NIO - Canali

Descrizione

Come suggerisce il nome, il canale viene utilizzato come mezzo del flusso di dati da un'estremità all'altra.Qui in java il canale NIO agisce allo stesso modo tra il buffer e un'entità all'altra estremità, in altre parole il canale viene utilizzato per leggere i dati nel buffer e anche per scrivere i dati dal buffer.

A differenza dei flussi che vengono utilizzati nei convenzionali canali Java IO sono a due vie, cioè possono leggere e scrivere. Il canale Java NIO supporta il flusso asincrono di dati sia in modalità di blocco che non di blocco.

Implementazioni di Channel

Il canale Java NIO è implementato principalmente nelle seguenti classi:

  • FileChannel- Per leggere i dati dal file usiamo il canale file. L'oggetto del canale file può essere creato solo chiamando il metodo getChannel () sull'oggetto file poiché non è possibile creare direttamente l'oggetto file.

  • DatagramChannel - Il canale del datagramma può leggere e scrivere i dati sulla rete tramite UDP (User Datagram Protocol). L'oggetto di DataGramchannel può essere creato utilizzando metodi di fabbrica.

  • SocketChannel- Il canale SocketChannel può leggere e scrivere i dati sulla rete tramite TCP (Transmission Control Protocol). Utilizza anche i metodi di fabbrica per creare il nuovo oggetto.

  • ServerSocketChannel- Il ServerSocketChannel legge e scrive i dati su connessioni TCP, come un server web. Per ogni connessione in entrata viene creato un SocketChannel.

Esempio

L'esempio seguente legge da un file di testo da C:/Test/temp.txt e stampa il contenuto sulla console.

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

Produzione

Hello World!