FileChannel#force 是否等同于 OutputStream#flush?我总是必须打电话给它吗?

Is FileChannel#force is equivalent to OutputStream#flush? Do I always have to call it?

我有一个 class 像 FilterOutputStream.

public class WritableFilterChannel implements WritableChannel {

    public WritableFilterChannel(final WritableByteChannel channel) {
        super();
        this.channel = channel;
    }

    // isOpen(), close() delegates to the channel
    // write(ByteBuffer) overridden to work differently

    protected WritableByteChannel channel;
}

当我传递 FileChannel 的实例时,除了 close() 之外没有其他方法 force()

FileChannel#force是否等同于OutputStream#flush?我总是必须调用它吗?

我必须这样做吗?

@Override
public void close() {
    if (channel instanceof FileChannel) throws IOException {
        ((FileChannel) channel).force(); // general solution?
    }
    channel.close();
}

"Equivalent"这个词太强了。 FileChannel.force(false) 类似于 OutputStream.flush()。 FileChannel 的 force() 方法比 OutputStream 的 flush() 方法returns 对文件状态提供更强的保证。

显然,您不必关闭 () 调用 force() 方法的 FileChannel。您应该只在完成后关闭频道。但是,不能保证关闭通道会导致相当于对其进行强制操作。如果您需要 force() 指定的行为作为通道关闭的一部分,那么您必须按照您在 close() 方法中的方式显式调用它。