在 Thinking in Java 一书中,有人告诉他们
请注意,任何打开文件的代码都会在finally子句中保护文件的close()调用,以保证文件正确关闭。
但是其他来源或汇总呢?至少目前我知道stdin
,stdout
,stderr
和ByteArrayInputStream
,ByteArrayOutputStream
不需要关闭 d。
至于stdin
,stdout
,stderr
我有两个理由不需要关闭:
stdin
的接收器是屏幕,stdout
和stderr
的来源是键盘,没有理由失去与屏幕和键盘的连接对于ByteArrayInputStream
和ByteArrayOutputStream
,Java文档告诉:
关闭ByteArrayInputStream无效。在关闭流之后可以调用此类中的方法,而不会生成IOException。
我想这可能是因为 array 位于磁盘以外的易失性内存中
但是我非常肯定这些分析,所以我想得到更准确和授权的答案,尤其是当我们自己设计流时,何时必须关闭流,何时不是?
同时,我想确认我的理由是关于不必要的关闭是好的,或者,如果有人能提供更多理由,那将不胜感激
答案 0 :(得分:2)
如果使用需要释放的操作系统资源,则需要关闭流。这是文件,网络连接等的情况。
更重要的是,关闭流可以保证刷新它,即任何尚未写入的数据都将被刷新。如果您只是在没有正确关闭流的情况下退出程序,则可能是文件缺少数据。
也就是说,最好关闭您正在使用的所有流。注意"关闭ByteArrayInputStream没有效果"意味着它也没有任何负面影响,所以只需关闭你不再需要的一切。
关于System
信息流(in
,out
,err
),您不能关闭这些信息流,因为您还没有打开它们,代码中的其他一些地方可能仍然想要使用它们。