【问题标题】:Releasing I/O resource properly正确释放 I/O 资源
【发布时间】:2012-12-26 13:13:32
【问题描述】:

我想知道释放文件资源/句柄的最佳/适当方式是什么。

繁体字,

BufferredInputStream stream = null
try{
  ----
  stream = new BufferredInputStream(new FileInputStream());
  ----
} finally{
  if(stream != null){
    stream.close()
  }

}

文件句柄是通过单独关闭BufferredInputStream.close 来释放还是需要显式调用底层stream(i.e. FileInputStream.close())

P.S. Javadoc for [FilterOutputStream.close] 方法指定它也将显式关闭底层流。但其他流似乎在文档中没有这个。

[FilterOutputStream.close]: http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FilterOutputStream.html#close%28%29

请指教。提前致谢。

【问题讨论】:

  • 您可以通过仅关闭 BufferredInputStream 对象并尝试操作 FileInputStream 并查看是否引发关闭流的任何异常来轻松测试它。我相信它会像您在许多文档示例中看到的那样关闭,底层流是匿名创建的
  • 只是一个建议:如果您使用的是 JDK 7,请使用 try-with-resources,它会简单得多。见here
  • 感谢 JavaNewbie_M107 的建议。 Java 7 尚未添加到项目中。很期待

标签: java file io


【解决方案1】:

您始终可以检查底层类的源代码以确定确切的行为。

但是,在这种情况下,在 BufferedInputStream 上调用 close() 也会关闭底层流,即 FileInputStream

源码可在here获取

【讨论】:

    【解决方案2】:

    你的方法是正确的。如有疑问,请始终检查源代码。 http://www.docjar.com/html/api/java/io/BufferedInputStream.java.html close 方法正在关闭链接到 BufferedInputStream 的“in”。

    【讨论】:

      【解决方案3】:

      当多个流被链接时,关闭最后构造的流将关闭底层流。所以,关闭BufferedInputStream 也会关闭底层的FileInputStream

      所以你只需在一个流上调用 close(),它就会自动关闭底层流。

      【讨论】:

      • 感谢您的回复。 javadoc没有提到这一点。是否有任何参考或证据来支持这个答案。正在解决一个关键问题以阻止文件句柄泄漏。
      • 查看 Mr.Usman 答案中的链接。滚动到底部,您将看到 close() 方法是如何工作的。它正在关闭链接到 BufferdInputStream 的 InputStream。
      【解决方案4】:

      BufferredInputStream 本身不保存任何系统资源,因此 BufferredInputStream.close() 将简单地将关闭调用传播到它包装的 InputStream.. 所以它应该可以正常工作。

      【讨论】:

        猜你喜欢
        • 2016-02-03
        • 1970-01-01
        • 2015-03-15
        • 1970-01-01
        • 1970-01-01
        • 2012-01-08
        • 2012-05-04
        • 2014-12-19
        • 2022-10-18
        相关资源
        最近更新 更多