Java NIO - 文件通道

  • 描述

    如前所述,Java NIO通道的实现引入了FileChannel 来访问文件的元数据属性,包括创建,修改,大小等。与此一起,FileChannel 是多线程的,这再次使Java NIO比Java IO更有效率。
    通常,我们可以说FileChannel是连接到文件的通道,通过该通道,您可以从文件中读取数据并将数据写入文件。FileChannel 的另一个重要特征是,它不能设置为非阻塞模式,并且始终以阻塞模式运行。
    我们不能直接获取FileChannel 对象,FileChannel 的对象通过 −
    • getChannel() − 方法在任何文件输入流、文件输出流或随机访问文件。
    • open() − 默认打开通道的FileChannel 方法。
    FileChannel 的对象类型取决于从对象创建中调用的类的类型,即如果对象是通过调用 FileInputStream 的 getchannel 方法创建的,则FileChannel 将打开以供读取,并将引发不可写通道异常,以防尝试写入它。
  • 下面的示例演示如何从 Java NIO FileChannel 读取和写入数据。
    下面的示例从 C:/Test/temp 读取temp.txt并将内容输出到控制台。

    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 Jc2182".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 Jc2182