关闭 OutputStream 之前是否需要刷新它?

问题描述 投票:0回答:1

有一些相关问题,但没有一个能够完全提供答案。

我提供了一个

Serializer
对象,它有一个
setOutputStream()
方法,允许用户提供输出的目的地。默认情况下,它遵循用户提供输出流的协议,用户负责关闭它。不过,
Serializer
还提供了一个选项
setCloseOnCompletion(boolean)
;如果调用此方法,序列化程序应在完成写入后自行关闭流。 (提供此选项的主要原因是,在某些情况下,可以通过这种方式更早地关闭流,从而释放资源)。

当然,

Serializer
不知道
OutputStream
的特定子类,因此它需要处理所有可能性。

我的主要问题是,我们应该在致电

stream.flush()
之前先致电
stream.close()
吗?

我本以为

stream.close()
会在必要时自动刷新流,但
OutputStream
合约中似乎没有任何内容强制执行此操作。

其次,如果我真的打电话

stream.flush()
,失败了怎么办?我是否会冒仅因为流已关闭而失败的风险,在这种情况下,我理想情况下希望忽略该错误?在我尝试flush()之前,有什么方法可以测试流是否已经关闭?

如果我今天设计这个 API,我可能会将

setCloseOnCompletion(boolean)
替换为
setCompletionAction(Action<OutputStream>)
- 但我不是。

java java-io
1个回答
0
投票

明确记录

close
OutputStream
方法什么也不做。

因此,如果 API 的用户提供自己的

OutputStream
对象,他们可能会也可能不会实现
close
来执行
flush
。 如果您需要冲洗流,自己冲洗是最安全的。

同样,不能保证在已经关闭的流上调用

flush
会抛出
IOException
。 或者,如果抛出
IOException
,那是因为流已经关闭。 所以你可能不想忽略这个异常。

© www.soinside.com 2019 - 2024. All rights reserved.