关闭Java中的流

关闭Java中的流,java,stream,Java,Stream,在任何情况下,为什么我们在离开程序之前都需要关闭FileInputStream(以及一般的streams)?否则会发生什么?如果程序在输入流在程序中显式关闭之前停止,该流是否也会自动关闭?是,当进程终止时,非托管资源将被释放。对于InputStreams,这很好。对于OutputStreams,您可能会丢失缓冲数据,因此您至少应该在退出程序之前刷新流。除了Jon的回答之外,通常最好关闭任何资源 考虑一个数据库连接。您的数据库不能打开无限个连接,在这种情况下,当您不需要它时,最好在处理完它后立即关

在任何情况下,为什么我们在离开程序之前都需要关闭FileInputStream(以及一般的streams)?否则会发生什么?如果程序在输入流在程序中显式关闭之前停止,该流是否也会自动关闭?

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

除了Jon的回答之外,通常最好关闭任何资源

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


这也是一个好习惯。“最后”block是你的朋友。在C++的情况下,也可以使用.< /p>排序。流由“真实”操作系统文件描述符支持,当进程终止时,操作系统将清除所有打开的文件描述符


无论如何,完成后总是关闭资源是一种很好的做法,因此关闭流:)

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

如果您只使用一个用户编写了一个小程序,那么您可以避免草率行事,不会陷入最后一个程序块

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


“首先我们养成习惯,然后他们养成我们。”我尝试应用最佳实践,即使它们不是必需的。

如果不关闭流,您可能无法重新打开它们。如果它们挂在插座的末端,这一点尤其正确


关闭流还可以确保在有任何数据要发送的情况下通过流刷新数据

伙计。如果不关闭流,单元测试将失败。至少,它应该这样做。所以,这就是为什么你需要关闭它

如果你刚刚退出,操作系统几乎肯定会清理干净,但如果你显式关闭操作系统,它们通常会更快地释放出来。此外,如果您的代码最终出现在一个长期运行的程序中怎么办?然后他们会有问题,诅咒你(


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

只是好奇,为什么这被否决了?对我来说似乎是一个很好的答案,尽管很有趣:)当然,我也想知道。)但也许评论者只是不欣赏答案的信息性和幽默性。我也不知道。对我来说,这是很有帮助的。就我个人而言,因为答案实际上没有任何技术性的内容——这会是一个更好的评论。除了“这是一个很好的实践”之外,我们没有更多的话要说,虽然我们在项目中经常为了方便而接受这样的解释,但对于堆栈溢出来说,这并不是一个足够好的答案。唐,对你来说没有什么个人冒犯的意思;我相信你知道你在说什么,但我更喜欢有更多内容的答案。那么当流对象超出范围(并被垃圾收集)时呢?它会被关闭吗?@Zippo:仅仅因为变量超出范围并不意味着该对象将被垃圾收集。垃圾收集是不确定的。有些流可能有一个终结器可以刷新它们,但依我看,依赖它是一个非常糟糕的主意。@Zippo:Thread.stop()无论如何都是不推荐的,因为停止线程通常不是一个好主意,而不是要求它以受控的方式停止自己。Java 8将具有一些功能,在退出作用域时可以自动关闭流,这与退出同步块时监视器锁的实现方式类似。@UstamanSangat:它在Java 7中,实际上:(假设这就是你的意思…)很多评论听起来像是“为什么你不关闭流”,但我认为你的问题不是“为什么”,而是“为什么明确”.而Java 8应该最终减少涉及到的锅炉板。Java 7实际上,Java.io.AutoCloseablenice解释道。谢谢。我肯定会回收习惯智慧。这是一句可引用的话。那句可引用的话(“首先我们养成习惯,然后他们养成我们。”)来自斯蒂芬·科维,晚了11年又错了。归因于约翰·德莱顿,一位死于1700年的诗人。科维没有那么聪明。