5

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

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

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

如评论中所述,这相当于标准 C 库函数aio_fsync: http: //pubs.opengroup.org/onlinepubs/009695399/functions/aio_fsync.html

4

1 回答 1

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's 方法不能抛出异常,因此 catch-call catch 块。对于我的申请,不需要绝对确定force已经完成,所以这不是问题。

于 2018-05-07T04:46:02.297 回答