需要关闭哪些类型的流以及原因

时间:2018-03-20 13:08:35

标签: java iostream

Thinking in Java 一书中,有人告诉他们

  

请注意,任何打开文件的代码都会在finally子句中保护文件的close()调用,以保证文件正确关闭。

但是其他来源汇总呢?至少目前我知道stdinstdoutstderrByteArrayInputStreamByteArrayOutputStream不需要关闭 d。

至于stdinstdoutstderr我有两个理由不需要关闭:

  1. 他们是Java 运行时
  2. 中的 singleton
  3. stdin的接收器是屏幕,stdoutstderr的来源是键盘,没有理由失去与屏幕和键盘的连接
  4. 对于ByteArrayInputStreamByteArrayOutputStream,Java文档告诉:

      

    关闭ByteArrayInputStream无效。在关闭流之后可以调用此类中的方法,而不会生成IOException。

    我想这可能是因为 array 位于磁盘以外的易失性内存中

    但是我非常肯定这些分析,所以我想得到更准确和授权的答案,尤其是当我们自己设计流时,何时必须关闭流,何时不是?

    同时,我想确认我的理由是关于不必要的关闭是好的,或者,如果有人能提供更多理由,那将不胜感激

1 个答案:

答案 0 :(得分:2)

如果使用需要释放的操作系统资源,则需要关闭流。这是文件,网络连接等的情况。

更重要的是,关闭流可以保证刷新它,即任何尚未写入的数据都将被刷新。如果您只是在没有正确关闭流的情况下退出程序,则可能是文件缺少数据。

也就是说,最好关闭您正在使用的所有流。注意"关闭ByteArrayInputStream没有效果"意味着它也没有任何负面影响,所以只需关闭你不再需要的一切。

关于System信息流(inouterr),您不能关闭这些信息流,因为您还没有打开它们,代码中的其他一些地方可能仍然想要使用它们。