我可以关闭底层输出流并让装饰器BufferedOutputStream不闭​​合

时间:2015-06-02 08:00:58

标签: java memory-management outputstream

我有多个

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

方法

给定的资源可能会被重用,因此方法实现不会释放。但是我想在某些情况下使用BufferedOutputStream修饰给定的输出流。

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

我的问题是:我可以安全地让装饰器关闭,让调用方法管理基础流发布吗?

1 个答案:

答案 0 :(得分:1)

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

但是如果你不关闭装饰类,你必须处理通常在close()方法中进行的方法调用。如果是BufferedOutputStream,您可以看到在超级FilterOutputStream flush()方法中调用了close()

要适应这些缺少的方法调用,请创建一个单独的NonClosingBufferedOutputStream类,该类扩展BufferedOutputStream,其中包含close() FilterOutputStream方法的修改版本(只需注释掉第out.close();行。您现在可以将此类用作普通Closeable,并避免来自IDE /编译器的警告。

我打算建议使用Apache commons-io中的CloseShieldOutputStream,但查看source code,似乎flush()方法中未调用close() 。尽管有这个缺点,用ClosedOutputStream取代底层输出流确实是一个好主意:它会更快地显示编程错误。

请注意,对于GZIPOutputStream等其他装饰类,除了flush()之外的其他方法也可能是合适的。在GZIPOutputStream的情况下,使用调整finish()的修改后的NonClosingGZIPOutputStream方法创建close()类可以解决问题。