首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用AsynchronousFileChannel异步强制文件

如何使用AsynchronousFileChannel异步强制文件
EN

Stack Overflow用户
提问于 2015-05-06 17:31:21
回答 1查看 400关注 0票数 5

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

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

我正在寻找一种在不阻塞线程的情况下实现相同目标的方法。

正如注释中所提到的,这相当于标准C库函数aio_fsynchttp://pubs.opengroup.org/onlinepubs/009695399/functions/aio_fsync.html

EN

回答 1

Stack Overflow用户

发布于 2018-05-07 12:46:02

我有一些代码,在这些代码中,我向一个文件发送了大量的写操作,主要是在即发即忘模式下。有时,我想刷新对磁盘的更改,只是为了让用户相信,即使断电,他们也不会失去一切。为此,我偶尔会这样做:

代码语言:javascript
复制
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已经完成,所以这不是问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30072817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档