Java NIO - kanał plików

Opis

Jak już wspomniano, wprowadzono implementację kanału Java NIO w FileChannel w celu uzyskania dostępu do właściwości metadanych pliku, w tym tworzenia, modyfikacji, rozmiaru itp. Wraz z tym kanałami plików są wielowątkowe, co ponownie sprawia, że ​​Java NIO jest bardziej wydajna niż Java IO.

Ogólnie możemy powiedzieć, że FileChannel jest kanałem podłączonym do pliku, przez który można odczytywać dane z pliku i zapisywać dane do pliku Inną ważną cechą FileChannel jest to, że nie można go ustawić w tryb nieblokujący i zawsze działa w trybie blokowania.

Nie możemy pobrać obiektu kanału plików bezpośrednio, obiekt kanału pliku jest uzyskiwany albo przez -

  • getChannel() - metoda na dowolnym FileInputStream, FileOutputStream lub RandomAccessFile.

  • open() - metoda kanału plików, która domyślnie otwiera kanał.

Typ obiektu kanału File zależy od typu klasy wywołanej podczas tworzenia obiektu, tj. Jeśli obiekt jest tworzony przez wywołanie metody getchannel z FileInputStream, wówczas kanał File jest otwierany do odczytu i zgłasza NonWritableChannelException w przypadku próby zapisu do niego.

Przykład

Poniższy przykład ilustruje sposób odczytywania i zapisywania danych z Java NIO FileChannel.

Poniższy przykład odczytuje z pliku tekstowego z C:/Test/temp.txt i drukuje zawartość na konsoli.

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

Wynik

Hello World! Welcome to TutorialsPoint