【问题标题】:IOUtils: is it required to close OutputStream?IOUtils:是否需要关闭OutputStream?
【发布时间】:2016-11-20 00:53:56
【问题描述】:

this answer,一个人建议使用IOUtils.copy,但他没有关闭OutputStream。这是他的例子:

InputStream is = new URL(imgUrl).openStream();
OutputStream os = servletResponse.getOutputStream();

IOUtils.copy(is, os);
is.close();

我检查了 IOUtils 中 copy 方法的 javadocs,没有任何信息表明 OutputStream 将自动关闭,所以我很好奇是否需要在该示例中关闭 OutputStream?

【问题讨论】:

  • 如果您确实打算关闭您的资源或 Steam,请确保在 finally 块内调用 close() 以确保它始终被执行。或者,在try-with-resources statement 中打开您的资源

标签: java apache-commons outputstream


【解决方案1】:

IOUtils.copy(InputStream, OutputStream) 不得关闭OutputStream。例如,您可以使用它来连接不同的 InputStreams,在这种情况下,如果它关闭提供的 Input- 和/或 OutputStream 将是一个坏主意。

根据经验,任何方法都应该只关闭它打开的那些蒸汽。 另见Should I close the servlet outputstream?

【讨论】:

    【解决方案2】:

    正如你所说,the documentation 没有说明为你关闭 OutputStream,所以你需要关闭它(明确地,或使用 try-with-resources)。

    Tomasz 没有关闭该答案中的流的原因是它是 servlet 响应的输出流。正如andiha comment 中所说,您只关闭您打开 的流。 servlet 容器管理 servlet 响应流。

    【讨论】:

    • 不要关闭 ServletResponse 的 OutputStream。您应该只关闭已打开的 Streams。另见:stackoverflow.com/questions/1829784/…
    • 确实,快速浏览一下源代码确认 IOUtils.copy 不会关闭任何一个流。
    猜你喜欢
    • 2015-04-01
    • 2018-07-15
    • 2010-11-28
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 2013-03-04
    • 1970-01-01
    相关资源
    最近更新 更多