gpt4 book ai didi

java - 在 Java 中,当我调用 OutputStream.close() 时,我是否总是需要先调用 OutputStream.flush()?

转载 作者:IT老高 更新时间:2023-10-28 20:45:32 25 4
gpt4 key购买 nike

如果我只是在输出流中调用 close(),输出是有保证的,还是需要我总是调用 flush()

最佳答案

虽然 close 应该调用 flush,但它比这要复杂一些...

首先,装饰器(如 BufferedOutputStream)在 Java 中很常见。装饰器的构造可能会失败,因此您需要在 try 包含装饰器的 finally block 中关闭“原始”流。在出现异常的情况下,您通常不需要close 装饰器(例如,执行不良的压缩装饰器除外)。在非异常情况下,您通常需要 flush 装饰器。因此:

final RawOutputStream rawOut = new RawOutputStream(rawThing);
try {
final DecoratedOutputStream out = new DecoratedOutputStream(rawOut);
// ... stuff with out within ...
out.flush();
} finally {
rawOut.close();
}

最重要的是,装饰器 close 方法的实现通常不正确。直到最近,这包括 java.io 中的一些内容。

当然,您可能想使用 Execute Around 习语来保持 DRY(ish)。

编辑: 从 Java 8 开始,您可以使用 try-with-resource 语句,该语句应该可以简洁明了地处理所有内容。即使不必要,代码也会对每个资源调用 close。

try (
RawOutputStream rawOut = new RawOutputStream(rawThing);
DecoratedOutputStream out = new DecoratedOutputStream(rawOut)
) {
// ... stuff with out within ...
}

关于java - 在 Java 中,当我调用 OutputStream.close() 时,我是否总是需要先调用 OutputStream.flush()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2732260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com