Java 关闭资源总是重要的吗?

Java 关闭资源总是重要的吗?,java,file,stream,resources,Java,File,Stream,Resources,我多次遇到这样的说法,即应用程序应该始终显式关闭它打开的所有资源 我的编程方法相当务实,我不喜欢盲目地遵循任何我看不清楚其好处的惯例。这就是我的问题 让我们假设: 我有一个小申请 它打开一些资源(例如文件、数据库连接、远程流)并对其进行处理 它工作几分钟,然后退出 假设它是Java语言(如果语言相关) 我真的需要关闭我打开的所有资源吗?我想当应用程序/虚拟机退出时,我打开的所有资源都将关闭/释放。我说得对吗 如果这是真的,那么是否有令人信服的理由关注在如此小、运行时间短的应用程序中关闭资源 更新

我多次遇到这样的说法,即应用程序应该始终显式关闭它打开的所有资源

我的编程方法相当务实,我不喜欢盲目地遵循任何我看不清楚其好处的惯例。这就是我的问题

让我们假设:

  • 我有一个小申请
  • 它打开一些资源(例如文件、数据库连接、远程流)并对其进行处理
  • 它工作几分钟,然后退出
  • 假设它是Java语言(如果语言相关)

  • 我真的需要关闭我打开的所有资源吗?我想当应用程序/虚拟机退出时,我打开的所有资源都将关闭/释放。我说得对吗

    如果这是真的,那么是否有令人信服的理由关注在如此小、运行时间短的应用程序中关闭资源

    更新:

    这个问题纯粹是假设性的,但是不关心这一点的论点是,我可能只是在编写一些快速脚本,不想编写任何与当前问题没有直接关系的不必要的代码:关闭资源,做所有这些冗长的try-catch-finally工作,处理我不关心的异常等

    问题的关键是不这样做是否会产生任何实际后果


    我想当应用程序/虚拟机退出时,我打开的所有资源都将关闭/释放

    对于一个未被正常释放的资源所发生的事情,您是无法控制的。它可能没有害处,也可能有一些害处。它还高度依赖于平台,因此仅在一个平台上进行测试也无济于事

    为什么我要关心在如此小、运行时间短的应用程序中关闭这些资源


    应用程序的大小应该无关紧要。首先,应用程序通常会增长;其次,如果你不练习正确的方法,你将不知道在重要的时候如何去做。

    简短的回答-是的。首先,这是一种可怕的编码实践,就像在生活的其他领域一样,不清理自己。另一方面,您无法预测操作系统是否会意识到java环境不再需要这些资源,并且您可能会在没有强制重新启动的情况下无法释放文件/等上的锁

    总是清理你打开的任何资源


    更新关于您对原始问题的更新-添加try/catch块以关闭任何打开的资源需要5秒钟,并且可以防止您花费5分钟重新启动计算机。把事情做好总是能节省时间。我爸爸总是告诉我,真正懒惰的人第一次就把事情做好,这样他们就不必回来再做了。我只是说不要偷懒,把事情做好。写入catch块所需的5秒时间永远不会显著减慢写入过程。。。不写入所节省的5秒钟可能会大大降低调试速度。

    如果不关闭资源,可能会导致应用程序服务器在资源耗尽时频繁重新启动。因为操作系统和服务器 应用程序通常有资源的上限

    典型的Java应用程序处理几种类型的资源,例如 文件、流、套接字和数据库连接。这些资源必须 非常小心地处理,因为它们为自己的应用程序获取系统资源 因此,您需要确保即使在出现错误的情况下也能释放它们

    事实上,不正确的资源管理是系统中常见的故障源 生产应用程序,通常的陷阱是数据库连接 以及在发生异常后保持打开状态的文件描述符 这导致应用服务器经常 在资源耗尽时重新启动,因为操作系统和服务器 应用程序通常有资源的上限。


    Java7中为讨厌close语句的程序员引入的语句

    让我为您回答一个问题:为什么您不关心关闭资源?“我猜当应用程序/虚拟机退出时,我打开的所有资源都将关闭/释放。”-->。如果不关闭并且VM退出,操作系统可能会负责关闭这些流/套接字。为了消除这些警告,您必须抑制它们,这与.close()的工作量一样大。这也是一种很好的形式。@EJP我明白你的意思。但我想问的是,如果这会有什么不同,我不会做得对(如果不是,那么我不想做得对)?但我得到了很好的答案,这解释了我是的,我会做出实际的改变。@PiotrSobczyk好问题!了解你应该做什么,以及为什么你这么做很重要,这总是很有帮助的+1.“就像在生活的其他领域一样,不清理自己的身体”,说得很好!谢谢,你说得很好。我并不是真的这么懒。我确实关闭了代码中的资源。只是我不喜欢公理和做事,“因为每个人都这么做”。这就是为什么我故意提出这样有争议的问题。我不喜欢的不仅仅是你提到的这5秒钟,而且是Java所需要的冗长而丑陋的代码。我们肯定需要切换到引入了try-with-resources的Java7。我还没有使用Java7中新的“try-with-resources”功能,但我同意你的看法:)+1关于
    try-with-resources
    的好提示。被困在Java 5的黑暗时代,我不知道它的存在。资源关闭需要大量的实践,因为它是@zapl,感谢伟大的链接!