Java NIO - Kênh tệp

Sự miêu tả

Như đã đề cập, việc triển khai FileChannel của kênh Java NIO được giới thiệu để truy cập các thuộc tính dữ liệu meta của tệp bao gồm tạo, sửa đổi, kích thước, v.v. Cùng với đó, các Kênh tệp này là đa luồng, điều này một lần nữa làm cho Java NIO hiệu quả hơn Java IO.

Nói chung, chúng ta có thể nói rằng FileChannel là một kênh được kết nối với một tệp mà qua đó bạn có thể đọc dữ liệu từ tệp và ghi dữ liệu vào tệp. Đặc điểm quan trọng khác của FileChannel là nó không thể được đặt ở chế độ không chặn và luôn chạy ở chế độ chặn.

Chúng tôi không thể lấy đối tượng kênh tệp trực tiếp, Đối tượng kênh tệp được lấy bằng cách -

  • getChannel() - phương thức trên bất kỳ FileInputStream, FileOutputStream hoặc RandomAccessFile nào.

  • open() - phương thức của kênh Tệp mà theo mặc định sẽ mở kênh.

Kiểu đối tượng của kênh Tệp phụ thuộc vào kiểu lớp được gọi từ quá trình tạo đối tượng, tức là nếu đối tượng được tạo bằng cách gọi phương thức getchannel của FileInputStream thì kênh Tệp được mở để đọc và sẽ ném NonWlikeChannelException trong trường hợp cố gắng ghi vào nó.

Thí dụ

Ví dụ sau đây cho thấy cách đọc và ghi dữ liệu từ Java NIO FileChannel.

Ví dụ sau đây đọc từ một tệp văn bản từ C:/Test/temp.txt và in nội dung ra bảng điều khiển.

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

Đầu ra

Hello World! Welcome to TutorialsPoint