我有多个
的实现 void convert(List< InputStream > list, OutputStream os)
方法
给定的资源可能会被重用,因此方法实现不会释放。但是我想在某些情况下使用BufferedOutputStream修饰给定的输出流。
关闭装饰器将导致关闭我想避免的底层流。
我的问题是:我可以安全地让装饰器关闭,让调用方法管理基础流发布吗?
答案 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()
类可以解决问题。