【问题标题】:Can I close underlying outputstream and let the decorator BufferedOutputStream unclosed我可以关闭底层输出流并让装饰器 BufferedOutputStream 未关闭吗
【发布时间】:2015-06-02 08:00:58
【问题描述】:

我有多个实现

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

方法。

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

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

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

【问题讨论】:

    标签: java memory-management outputstream


    【解决方案1】:

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

    但是如果不关闭装饰类,则必须注意通常发生在close() 方法中的方法调用。在BufferedOutputStream 的情况下,您可以看到flush() 在超类FilterOutputStream close() 方法中被调用。

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

    我本来打算推荐使用来自 Apache commons-io 的CloseShieldOutputStream,但是查看source code,似乎flush() 没有在close() 方法中调用。尽管有这个缺点,用ClosedOutputStream 替换底层输出流似乎是一个好主意:它会更快地显示编程错误。

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

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 2014-07-26
      • 2011-05-26
      • 2015-06-20
      • 1970-01-01
      • 2021-11-23
      • 2012-02-07
      • 2015-12-11
      相关资源
      最近更新 更多