51

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

4

6 回答 6

44

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

如果你编写了一个只有一个用户的小程序,你可以摆脱马虎而不是在 finally 块中关闭。

但是,如果您最终在具有许多用户和文件句柄的应用程序中使用该惯用语,您可能会遇到问题。

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

于 2009-02-05T13:58:42.130 回答
36

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

于 2009-02-05T13:57:17.390 回答
25

老兄。如果您不关闭流,您的单元测试将失败。或者至少,它应该。所以,这就是为什么你需要关闭它。;)

虽然如果您只是退出,操作系统几乎肯定会清理干净,但如果您明确关闭它们,它们通常会更快地释放出来。此外,如果您的代码在某个时间出现在一个长时间运行的程序中怎么办?然后他们就会有问题并诅咒你。:(

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

于 2009-02-05T14:04:31.447 回答
10

除了乔恩的回答之外,关闭任何资源通常是一个好主意。

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

养成这个习惯也很好。“终于”块是你的朋友。在 C++ 的情况下,您还可以使用RAII 自动管理它

于 2009-02-05T13:58:10.680 回答
7

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

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

于 2009-02-05T13:58:22.537 回答
7

如果您不关闭流,则再次打开它们可能会遇到问题。如果它们挂在插座的末端,则尤其如此。

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

于 2009-02-05T13:58:51.897 回答