`

【Java NIO 简例】AsynchronousFileChannel

    博客分类:
  • Java
nio 
阅读更多

原文:《Java NIO AsynchronousFileChannel

AsynchronousFileChannel 使得异步读写文件成为可能。此教程将解释如何使用该类。

 

创建一个 AsynchronousFileChannel

可通过 AsynchronousFileChannel.open() 方法创建实例:

Path path = Paths.get("C:\\test\\file1.txt");
AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ);

 

读数据

可通过以下两种方式读取文件数据。两种方式都调用了 AsynchronousFileChannel.read() 方法。

通过 Future 读数据

read() 方法会立即返回一个 Future 对象,且不保证数据读取完成,所以需要有后续操作确保等到读取完成后再使用缓冲区中的数据。

Future operation = fileChannel.read(buffer, 0);

 

此示例中等待读取完成的方式并未充分利用CPU资源,它仅用于说明需要等数据读取完成后再操作缓存区:

AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ);
ByteBuffer buffer = ByteBuffer.allocate(1024);

// 从文件起始处开始读,所以 position 为 0
Future operation = fileChannel.read(buffer, 0);

while(!operation.isDone()) {
}

buffer.flip();
byte[] data = new byte[buffer.limit()];
buffer.get(data);
// data 就是读到的数据

 

通过 CompletionHandler 读数据

例:

// 从文件起始处开始读,所以 position 为 0
fileChannel.read(buffer, 0, buffer, new CompletionHandler<Integer, ByteBuffer>() {
  @Override
  public void completed(Integer result, ByteBuffer attachment) {
    System.out.println("read byte count: " + result);
    attachment.flip();
    byte[] data = new byte[attachment.limit()];
    attachment.get(data);
    // data 就是读到的数据
  }

  @Override
  public void failed(Throwable exc, ByteBuffer attachment) {
  }
});

该示例中,将 buffer 作为 CompletionHandler 的 “附件(attachment)” 只是为了操作方便,你可以选择其它对象(下同)。

读取操作失败时会调用 failed() 方法,而非 completed()(下同)。

 

写数据

类似的,写数据也有两种方式,都调用 AsynchronousFileChannel.write() 方法

通过 Future 写数据

例:

// byte[] data = ...

Path path = Paths.get("C:\\test\\file1.txt");
AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.WRITE, StandardOpenOption.CREATE);
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.put(data);
buffer.flip();

// 从文件起始处开始写,所以 position 为 0
Future operation = fileChannel.write(buffer, 0);

while (!operation.isDone()) {
  // 等待写操作完成
}

StandardOpenOption.CREATE 是为了确保文件存在(下同)。

 

通过 CompletionHandler 写数据

例:

// byte[] data = ...

Path path = Paths.get("C:\\test\\file1.txt");
AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.WRITE, StandardOpenOption.CREATE);
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.put(data);
buffer.flip();

// 从文件起始处开始写,所以 position 为 0
fileChannel.write(buffer, 0, buffer, new CompletionHandler<Integer, ByteBuffer>() {
  @Override
  public void completed(Integer result, ByteBuffer attachment) {
    System.out.println("written byte count: " + result);
  }

  @Override
  public void failed(Throwable exc, ByteBuffer attachement) {
  }
});
分享到:
评论

相关推荐

    java NIO和java并发编程的书籍

    java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...

    JavaNIO chm帮助文档

    Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...

    java nio 包读取超大数据文件

    Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据...

    Java NIO英文高清原版

    Java NIO英文高清原版

    java NIO 中文版

    讲解了 JavaIO 与 JAVA NIO区别,JAVA NIO设计理念,以及JDK中java NIO中语法的使用

    Java NIO 中文 Java NIO 中文 Java NIO 中文文档

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...

    java NIO 视频教程

    Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...

    java nio 实现socket

    java nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socket

    java nio中文版

    java NIO是 java New IO 的简称,在 jdk1.4 里提供的新 api 。 Sun 官方标榜的特性如下: – 为所有的原始类型提供 (Buffer) 缓存支持。 – 字符集编码解码解决方案。 – Channel :一个新的原始 I/O 抽象。 – 支持...

    基于Java NIO实现五子棋游戏.zip

    基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现...

    Java Nio selector例程

    java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...

    【Java NIO 简例】分散(Scatter) – 聚集(Gather)

    原文:《Java NIO Scatter / Gather》 Scatter(分散):将一个 Channel 中的数据读取到多个 Buffer 中。 Gather(聚集):将多个 Buffer 中的数据写入一个 Channel 中。 Scatter/Gather 机制可以方便处理多个分开的...

    java NIO技巧及原理

    java NIO技巧及原理解析,java IO原理,NIO框架分析,性能比较

    java基于NIO实现Reactor模型源码.zip

    java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现...

    java NIO.zip

    java NIO.zip

    Java NIO实战开发多人聊天室

    01-Java NIO-课程简介.mp4 05-Java NIO-Channel-FileChannel详解(一).mp4 06-Java NIO-Channel-FileChannel详解(二).mp4 08-Java NIO-Channel-ServerSocketChannel.mp4 09-Java NIO-Channel-SocketChannel.mp4 ...

    java nio 读文件

    java nio 读文件,java nio 读文件

    JAVA NIO 学习资料

    JAVA NIO学习资料JAVA NIO学习资料

    java nio入门学习,两个pdf

    java nio入门学习,两个pdfjava nio入门学习,两个pdf

    Java NIO (中文版)

    Java NIO (中文版) PDF文档,带目录,非图片扫描 !!!

Global site tag (gtag.js) - Google Analytics