Java NIO.2中的AsynchronousFileChannel API包含void force(boolean)方法。
显然,这个方法是阻塞的,因为它只有在更改成功写入设备后才能返回。
我正在寻找一种在不阻塞线程的情况下实现相同目标的方法。
正如注释中所提到的,这相当于标准C库函数aio_fsync:http://pubs.opengroup.org/onlinepubs/009695399/functions/aio_fsync.html
发布于 2018-05-07 12:46:02
我有一些代码,在这些代码中,我向一个文件发送了大量的写操作,主要是在即发即忘模式下。有时,我想刷新对磁盘的更改,只是为了让用户相信,即使断电,他们也不会失去一切。为此,我偶尔会这样做:
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已经完成,所以这不是问题。
https://stackoverflow.com/questions/30072817
复制相似问题