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/