在Java中关闭Streams

时间:2009-02-05 13:55:45

标签: java stream

为什么我们在离开程序之前需要关闭一个FileInputStream(以及一般的流) ?否则会发生什么?如果程序在程序中明确关闭输入流之前停止,则流是否也会自动关闭?

6 个答案:

答案 0 :(得分:45)

文件句柄稀缺,资源有限。如果你没有正确清理它们,就像数据库连接一样,你可以用完它们。

如果你只用一个用户编写了一个小程序,那么你可以通过草率而不是在最后一个块中关闭。

但如果您最终在具有许多用户和文件句柄的应用程序中使用该习惯用法,则可能会出现问题。

“首先我们养成习惯,然后他们就养成了我们。”即使没有必要,我也尝试应用最佳实践。

答案 1 :(得分:36)

是的,当进程终止时,将释放非托管资源。对于InputStreams,这很好。对于OutputStreams,您可能会丢失缓冲数据,因此在退出程序之前,至少要刷新流。

答案 2 :(得分:25)

多德。如果不关闭流,则单元测试将失败。或者至少,它应该。所以,这就是你需要关闭它的原因。 ;)

虽然如果你只是退出操作系统几乎肯定会清理,但如果你明确关闭它们,它们通常会更快地释放。如果你的代码最终会在一个长期运行的程序中结束,那该怎么办呢?然后他们会有问题并诅咒你。 :(

所以,就像在洗手间后洗手一样。最终,如果你不这样做,有人会付出代价。你可以暂时离开它,但它仍然是一个很好的做法。

答案 3 :(得分:10)

除了Jon的回答,关闭任何资源通常都是个好主意。

想想数据库连接。您的数据库无法打开无限连接,在这种情况下,当您不需要它时,最好在完成后立即关闭它。

这也是一种习惯。 “终于”阻止是你的朋友。对于C ++,您也可以使用RAII to manage this automatically

答案 4 :(得分:7)

排序。该流由“真实”操作系统文件描述符支持,当进程终止时,操作系统将清理所有打开的文件描述符。

无论如何,在完成后总是关闭资源是一种好习惯,所以关闭流:)

答案 5 :(得分:6)

如果您不关闭流,则可能无法再次打开它们。如果它们挂在套接字的末端,则尤其如此。

如果还有任何数据需要发送,关闭流还可以确保通过流刷新数据。