Java NIO.2 中的AsynchronousFileChannel
API 包含该void force(boolean)
方法。
显然,这种方法是阻塞的,因为它只能在更改成功写入设备后返回。
我正在寻找一种方法来实现相同的目标,而不会阻塞线程。
如评论中所述,这相当于标准 C 库函数aio_fsync
: http: //pubs.opengroup.org/onlinepubs/009695399/functions/aio_fsync.html
Java NIO.2 中的AsynchronousFileChannel
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();
}
}
});
这似乎确实会导致更改反映在磁盘上,并且不会阻塞调用线程。当然,它确实会阻塞通道线程池中的一个线程,从而阻止其他写入在一段时间内完成。
它还有一个缺点是CompletionHandler
's 方法不能抛出异常,因此 catch-call catch 块。对于我的申请,不需要绝对确定force
已经完成,所以这不是问题。