java - 如何使用 AsynchronousFileChannel 异步强制文件

标签 java asynchronous nio nio2

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

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

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

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

最佳答案

我有一些代码,我将大量写操作发送到一个文件,主要是在即发即弃模式下。有时,我想将更改刷新到磁盘,只是为了给用户一些信心,即如果电源出现故障,他们不会丢失所有内容。为此,我偶尔会这样做:

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();
        }
    }
});

这似乎确实会导致更改反射(reflect)在磁盘上,并且不会阻塞调用线程。当然,它确实会阻塞 channel 线程池中的一个线程,从而阻止其他写入操作完成一段时间。

它还有一个缺点,即 CompletionHandler 的方法不能抛出异常,因此会出现 catch-call catch block 。对于我的应用程序,不需要绝对确定 force 已经完成,所以这不是问题。

关于java - 如何使用 AsynchronousFileChannel 异步强制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30072817/

相关文章:

java - 如何在 Java 中通过引用传递可变参数

java - 从java中的字符串中获取<img>值

ios - 从 Swift 函数中的异步调用返回数据

python - asyncio.to_thread() 方法与 ThreadPoolExecutor 不同吗?

ssl - Apache http core nio 4.3.3反向代理SSL错误

java - 将文件读入操作系统文件缓存的最快方法

java - 应用程序配置,Bean 到 xml

java - 如何获取 HashMap 值的属性?

node.js - NodeJS 中使用流和异步读取和处理大小文件

java - 向多个客户端发送文件数据?