技术开发 频道

Java7 NIO.2入门:异步通道API教程

  实现一个完成处理程序

  接下来,可将这些写入文件,写入完成后,就可执行一些操作。 首先要构造一个封装了 “ something ” 的 CompletionHandler ,如清单 2 所示:

  清单 2. 创建完成处理程序

CompletionHandler<Integer, Object> handler =
    
new CompletionHandler<Integer, Object>() {
    @Override
    
public void completed(Integer result, Object attachment) {
        System.out.println(attachment
+ " completed with " + result + " bytes written");
    }
    @Override
    
public void failed(Throwable e, Object attachment) {
        System.err.println(attachment
+ " failed with:");
        e.printStackTrace();
    }
};

  现在可以进行写入:

fileChannel.write(ByteBuffer.wrap(bytes), 0, "Write operation 1", handler);

  write() 方法采取:

  • 包含要写入内容的 ByteBuffer
  • 文件中的绝对位置
  • 要传递给完成处理程序方法的附件对象
  • 完成处理程序

  操作必须给出进行读或写的文件中的绝对位置。文件具有内部位置标记,来指出读/写发生的位置,这样做没有意义,因为在上一个操作完成之前,就可以启动新操作,它们的发生顺序无法得到保证。由于相同的原因,在 AsynchronousFileChannel API 中没有用于设置或查询位置的方法,在 FileChannel 中同样也没有。

  除了读写方法之外,还支持异步锁定方法,因此,如果当前有其他线程保持锁定时,可对文件进行执行访问锁定,而不必在当前线程中锁定(或者利用 tryLock 轮询)。

0
相关文章