有一些相关问题,但没有一个能够完全提供答案。
我提供了一个
Serializer
对象,它有一个 setOutputStream()
方法,允许用户提供输出的目的地。默认情况下,它遵循用户提供输出流的协议,用户负责关闭它。不过,Serializer
还提供了一个选项setCloseOnCompletion(boolean)
;如果调用此方法,序列化程序应在完成写入后自行关闭流。 (提供此选项的主要原因是,在某些情况下,可以通过这种方式更早地关闭流,从而释放资源)。
当然,
Serializer
不知道OutputStream
的特定子类,因此它需要处理所有可能性。
我的主要问题是,我们应该在致电
stream.flush()
之前先致电stream.close()
吗?
我本以为
stream.close()
会在必要时自动刷新流,但 OutputStream
合约中似乎没有任何内容强制执行此操作。
其次,如果我真的打电话
stream.flush()
,失败了怎么办?我是否会冒仅因为流已关闭而失败的风险,在这种情况下,我理想情况下希望忽略该错误?在我尝试flush()之前,有什么方法可以测试流是否已经关闭?
如果我今天设计这个 API,我可能会将
setCloseOnCompletion(boolean)
替换为 setCompletionAction(Action<OutputStream>)
- 但我不是。
明确记录,
close
的OutputStream
方法什么也不做。
因此,如果 API 的用户提供自己的
OutputStream
对象,他们可能会也可能不会实现 close
来执行 flush
。 如果您需要冲洗流,自己冲洗是最安全的。
同样,不能保证在已经关闭的流上调用
flush
会抛出 IOException
。 或者,如果抛出 IOException
,那是因为流已经关闭。 所以你可能不想忽略这个异常。