如何使用AsynchronousFileChannel

时间:2015-05-06 09:31:21

标签: java asynchronous nio nio2

Java NIO.2中的AsynchronousFileChannel API包含void force(boolean)方法。

显然这种方法是阻塞的,因为只有在将更改成功写入设备后才能返回。

我正在寻找一种方法来实现同样的目标,而不会阻塞线程。

如评论中所述,这将等同于标准C库函数aio_fsynchttp://pubs.opengroup.org/onlinepubs/009695399/functions/aio_fsync.html

1 个答案:

答案 0 :(得分:0)

我有一些代码,我向文件发送了大量的写操作,大多数都处于“即发即弃”模式。偶尔,我想将更改刷新到磁盘只是为了让用户有信心,如果电源出现故障,他们就不会失去一切。为此,我偶尔会这样做:

channel.write(ByteBuffer.wrap(new byte[0]), 0, null, new CompletionHandler<Integer, Object>() {
    @Override
    public void completed(Integer result, Object attachment) {
        try {
            channel.force(false);
        }
        catch (Throwable t) {
            t.printStackTrace();
        }
    }

    @Override
    public void failed(Throwable exc, Object attachment) {
        try {
            channel.force(false);
        }
        catch (Throwable t) {
            t.printStackTrace();
        }
    }
});

这似乎会导致更改反映在磁盘上,并且不会阻止调用线程。当然,它会阻塞通道的线程池中的一个线程,从而阻止其他写入一段时间完成。

它的缺点是CompletionHandler的方法不能抛出异常,因此catch-call catch块。对于我的应用程序,绝对确定force已完成不是必需的,所以这不是问题。