Java NIO - Canale file

Descrizione

Come già accennato, l'implementazione FileChannel del canale Java NIO è stata introdotta per accedere alle proprietà dei metadati del file, inclusa la creazione, la modifica, la dimensione, ecc. Insieme a questo File, i canali sono multi thread, il che rende ancora Java NIO più efficiente di Java IO.

In generale possiamo dire che FileChannel è un canale che è collegato a un file tramite il quale è possibile leggere dati da un file e scrivere dati su un file. Altra caratteristica importante di FileChannel è che non può essere impostato in modalità non bloccante e funziona sempre in modalità di blocco.

Non possiamo ottenere direttamente l'oggetto canale file, l'oggetto del canale file è ottenuto da -

  • getChannel() - metodo su qualsiasi FileInputStream, FileOutputStream o RandomAccessFile.

  • open() - metodo di File channel che di default apre il canale.

Il tipo di oggetto del canale File dipende dal tipo di classe chiamata dalla creazione dell'oggetto, cioè se l'oggetto viene creato chiamando il metodo getchannel di FileInputStream, il canale File viene aperto per la lettura e lancerà NonWritableChannelException nel caso in cui si tenti di scrivere su di esso.

Esempio

Il seguente esempio mostra come leggere e scrivere dati da Java NIO FileChannel.

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

temp.txt

Hello World!

FileChannelDemo.java

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.HashSet;
import java.util.Set;

public class FileChannelDemo {
   public static void main(String args[]) throws IOException {
      //append the content to existing file 
      writeFileChannel(ByteBuffer.wrap("Welcome to TutorialsPoint".getBytes()));
      //read the file
      readFileChannel();
   }
   public static void readFileChannel() throws IOException {
      RandomAccessFile randomAccessFile = new RandomAccessFile("C:/Test/temp.txt",
      "rw");
      FileChannel fileChannel = randomAccessFile.getChannel();
      ByteBuffer byteBuffer = ByteBuffer.allocate(512);
      Charset charset = Charset.forName("US-ASCII");
      while (fileChannel.read(byteBuffer) > 0) {
         byteBuffer.rewind();
         System.out.print(charset.decode(byteBuffer));
         byteBuffer.flip();
      }
      fileChannel.close();
      randomAccessFile.close();
   }
   public static void writeFileChannel(ByteBuffer byteBuffer)throws IOException {
      Set<StandardOpenOption> options = new HashSet<>();
      options.add(StandardOpenOption.CREATE);
      options.add(StandardOpenOption.APPEND);
      Path path = Paths.get("C:/Test/temp.txt");
      FileChannel fileChannel = FileChannel.open(path, options);
      fileChannel.write(byteBuffer);
      fileChannel.close();
   }
}

Produzione

Hello World! Welcome to TutorialsPoint