Java NIO - Canal de archivos

Descripción

Como ya se mencionó, la implementación de FileChannel del canal Java NIO se introduce para acceder a las propiedades de metadatos del archivo, incluida la creación, modificación, tamaño, etc.Junto con esto, los canales de archivos son multiproceso, lo que nuevamente hace que Java NIO sea más eficiente que Java IO.

En general, podemos decir que FileChannel es un canal que está conectado a un archivo mediante el cual puede leer datos de un archivo y escribir datos en un archivo.Otra característica importante de FileChannel es que no se puede configurar en modo sin bloqueo y siempre se ejecuta en modo de bloqueo.

No podemos obtener el objeto del canal de archivos directamente, el objeto del canal de archivos se obtiene mediante:

  • getChannel() - método en cualquier FileInputStream, FileOutputStream o RandomAccessFile.

  • open() - método de canal de archivo que por defecto abre el canal.

El tipo de objeto del canal de archivo depende del tipo de clase llamada desde la creación del objeto, es decir, si el objeto se crea llamando al método getchannel de FileInputStream, el canal de archivo se abre para lectura y lanzará NonWritableChannelException en caso de que intente escribir en él.

Ejemplo

El siguiente ejemplo muestra cómo leer y escribir datos desde Java NIO FileChannel.

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!

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

Salida

Hello World! Welcome to TutorialsPoint