gpt4 book ai didi

java - 我可以关闭底层输出流并让装饰器 BufferedOutputStream 未关闭吗

转载 作者:行者123 更新时间:2023-11-30 08:09:32 24 4
gpt4 key购买 nike

我有多个实现

 void convert(List< InputStream > list, OutputStream os)

方法。

给定的资源可以重用,因此方法实现不会释放它们。不过,在某些情况下,我想用 BufferedOutputStream 来装饰给定的输出流。

关闭装饰器将导致关闭我想避免的底层流。

我的问题是这样的:我可以安全地让装饰器打开并让调用方法管理底层流释放吗?

最佳答案

装饰类通常不会打开必须关闭以防止资源泄漏的系统资源(例如操​​作系统文件句柄)。给定的OutputStream参数必须关闭(因为它可能与开放的系统资源关联),但正如您提到的,这是调用者的责任。

但是如果您不关闭装饰类,则必须处理通常发生在 close() 中的方法调用。方法。如果是 BufferedOutputStream 你可以看到flush()在父类(super class)中被称为 FilterOutputStream close()方法。

为了容纳这些缺失的方法调用,请创建一个单独的 NonClosingBufferedOutputStream扩展类 BufferedOutputStream包含 close() 的修改版本方法来自 FilterOutputStream (只需注释掉 out.close(); 行)。您现在可以像普通类一样使用此类 Closeable并避免来自 IDE/编译器的警告。

我本来建议使用 CloseShieldOutputStream 来自 Apache commons-io,但查看 source code ,看来flush() close() 中未调用方法。尽管有这个缺点,用 ClosedOutputStream 替换底层输出流看起来确实是个好主意:它将更快地显示编程错误。

请注意,对于其他装饰类,例如 GZIPOutputStream ,除了 flush() 之外的其他方法可能是合适的。在 GZIPOutputStream的案例,创建 NonClosingGZIPOutputStream修改后的类 close()调用 finish() 的方法可以做到这一点。

关于java - 我可以关闭底层输出流并让装饰器 BufferedOutputStream 未关闭吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30590555/

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