在Java中closuresstream
为什么我们在离开程序之前需要closures一个FileInputStream(以及一般的stream)? 会发生什么事情呢? 如果程序在inputstream在程序中明确closures之前停止,那么stream是否也自动closures?
文件句柄是稀缺的,有限的资源。 如果你没有正确地清理它们,就像数据库连接一样,你可以用尽它们。
如果你只用一个用户编写了一个小程序,你可以逃避马虎,而不是在finally块中closures。
但是,如果您最终在具有多个用户和文件句柄的应用程序中使用该成语,则可能会遇到问题。
“首先,我们制定习惯,然后制造我们。” 即使在没有必要的情况下,我也会尝试应用最佳实践。
是的,当进程终止时,非托pipe资源将被释放。 对于InputStreams,这很好。 对于OutputStreams,可能会丢失缓冲的数据,所以在退出程序之前至less应该刷新stream。
多德。 如果你不closures你的stream,你的unit testing将失败。 或者至less,它应该。 所以,这就是为什么你需要closures它。 ;)
而如果你刚刚退出,操作系统几乎肯定会清理干净,如果你明确地closures它们,通常它们会更快地被释放。 此外,如果您的代码在某个时间段结束了长时间运行的程序呢? 然后他们会有问题,诅咒你。 🙁
所以,就像洗完澡后洗手一样。 最后有人会付出代价,如果你不这样做。 你可以放弃一段时间,但这仍然是一个好习惯。
除了Jon的回答,closures任何资源通常是一个好主意。
想想数据库连接。 你的数据库不能打开无限的连接,在这种情况下,当你不需要它的时候,最好在你完成后closures它。
使这成为一种习惯也是一件好事。 “终于”块是你的朋友。 在C ++的情况下,你也可以使用RAII来自动pipe理这个 。
有点。 该stream由一个“真实的”操作系统文件描述符支持,当进程终止时,操作系统将清除所有打开的文件描述符。
无论如何,这是一个很好的习惯,当你完成时总是closures你的资源,所以closuresstream:)
如果你不closuresstream,你可能会遇到问题,打开它们。 如果他们挂在sockets的末端,情况尤其如此。
如果还有数据需要发送,closures数据stream还可以确保数据在数据stream中被刷新。