Java NIO - 文件通道


描述

正如已经提到的,Java NIO 通道的 FileChannel 实现被引入来访问文件的元数据属性,包括创建、修改、大小等。此外,文件通道是多线程的,这再次使得 Java NIO 比 Java IO 更高效。

一般来说,我们可以说FileChannel是一个连接到文件的通道,通过它可以从文件中读取数据,并向文件中写入数据。FileChannel的另一个重要特性是它不能设置为非阻塞模式并且始终以阻塞模式运行。

我们无法直接获取文件通道对象,文件通道对象可以通过以下方式获取:

  • getChannel() - 任何 FileInputStream、FileOutputStream 或 RandomAccessFile 上的方法。

  • open() - 文件通道的方法,默认情况下打开通道。

文件通道的对象类型取决于对象创建时调用的类的类型,即,如果通过调用 FileInputStream 的 getchannel 方法创建对象,则文件通道将打开以供读取,并且在尝试写入时将抛出 NonWritableChannelException。

例子

以下示例展示了如何从 Java NIO FileChannel 读取和写入数据。

以下示例从C:/Test/temp.txt中的文本文件读取并将内容打印到控制台。

临时文件.txt

Hello World!

文件通道演示.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();
   }
}

输出

Hello World! Welcome to TutorialsPoint