Java NIO.2中的AsynchronousFileChannel
API包含void force(boolean)
方法。
显然这种方法是阻塞的,因为只有在将更改成功写入设备后才能返回。
我正在寻找一种方法来实现同样的目标,而不会阻塞线程。
如评论中所述,这将等同于标准C库函数aio_fsync
:http://pubs.opengroup.org/onlinepubs/009695399/functions/aio_fsync.html
答案 0 :(得分: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
的方法不能抛出异常,因此catch-call catch块。对于我的应用程序,绝对确定force
已完成不是必需的,所以这不是问题。