Java Language Leggere un file usando Channel e Buffer


Esempio

Channel utilizza un Buffer per leggere / scrivere dati. Un buffer è un contenitore di dimensioni fisse in cui è possibile scrivere un blocco di dati contemporaneamente. Channel è molto più veloce di I / O basato sul flusso.

Per leggere i dati da un file utilizzando il Channel è necessario avere i seguenti passaggi:

  1. Abbiamo bisogno di un'istanza di FileInputStream . FileInputStream ha un metodo chiamato getChannel() che restituisce un canale.
  2. Chiama il metodo getChannel() di FileInputStream e acquisisci Canale.
  3. Crea un ByteBuffer. ByteBuffer è un contenitore di byte di dimensioni fisse.
  4. Il canale ha un metodo di lettura e dobbiamo fornire un ByteBuffer come argomento per questo metodo di lettura. ByteBuffer ha due modalità: umore di sola lettura e umore di sola scrittura. Possiamo cambiare la modalità usando la chiamata al metodo flip() . Il buffer ha una posizione, un limite e una capacità. Una volta creato un buffer con una dimensione fissa, il suo limite e la sua capacità sono uguali a quelli della dimensione e la posizione inizia da zero. Mentre un buffer è scritto con dati, la sua posizione aumenta gradualmente. Cambiare modalità significa, cambiare la posizione. Per leggere i dati dall'inizio di un buffer, dobbiamo impostare la posizione a zero. flip () metodo cambia la posizione
  5. Quando chiamiamo il metodo di lettura del Channel , riempie il buffer usando i dati.
  6. Se abbiamo bisogno di leggere i dati dal ByteBuffer , dobbiamo capovolgere il buffer per cambiarne la modalità in sola scrittura in modalità di sola lettura e quindi continuare a leggere i dati dal buffer.
  7. Quando non ci sono più dati da leggere, il metodo read() del canale restituisce 0 o -1.
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class FileChannelRead {
 
public static void main(String[] args) {
  
   File inputFile = new File("hello.txt");
  
   if (!inputFile.exists()) {
    System.out.println("The input file doesn't exit.");
    return;
   }

  try {
   FileInputStream fis = new FileInputStream(inputFile);
   FileChannel fileChannel = fis.getChannel();
   ByteBuffer buffer = ByteBuffer.allocate(1024);

   while (fileChannel.read(buffer) > 0) {
    buffer.flip();
    while (buffer.hasRemaining()) {
     byte b = buffer.get();
     System.out.print((char) b);
    }
    buffer.clear();
   }

   fileChannel.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}