【问题标题】:What is the consequence of not closing a BufferedWriter不关闭 BufferedWriter 的后果是什么
【发布时间】:2014-03-21 03:00:22
【问题描述】:

假设我有一个 BufferedWriter 已写入 5000 行(其中一些尚未刷新)。

如果我在程序结束时不close() 这个实例会有什么后果?

【问题讨论】:

  • 试试看。 然后询问文档是否没有解释和/或您不理解它。解释为什么会这样。
  • @SotiriosDelimanolis 为什么你不能直接告诉我答案?根据我对 meta 的阅读,可以询问可搜索的答案(例如“如何在 python 中生成随机数”)。此外,我只能测试一个小案例,并且可能存在开发人员可以阐明的边缘案例。
  • 我会在这个list of bad things上想象任何东西。
  • Jason C 很有趣 :-))

标签: java io bufferedwriter writer


【解决方案1】:

如果您在程序结束前不close() 它,则尚未写入的缓冲数据将永远不会被写入。

BufferedWriter 在 Java 领域完成所有缓冲(而不是仅仅依赖于操作系统的较低级别的缓冲区)。因此,它需要一个明确的操作来刷新缓冲区并关闭文件,因为这不会在您的程序退出时自动发生(主要是由于 Java 的 GC 特性以及对何时和是否缺乏保证,例如,@987654324 @ 叫做)。

因此,当程序退出时,BufferedWriter 的缓冲区中仍然存在的任何内容最终都会永远丢失。

你应该养成close()ing 流的习惯,当你用完它们(以及nulling 对它们的任何引用,以便 GC 可以丢弃该对象;这对BufferedWriters 的行为,但这是一个很好的一般做法)。至少,如果您已写入重要数据,并且无论是否需要关闭流,都需要确保已将其写入磁盘,您可以根据需要显式调用 flush()

BufferedWritercan be found here 的源代码,如果你想看看实现的话。

【讨论】:

    【解决方案2】:

    它实际上可能没有完成将数据写入到它正在写入数据的任何位置。因此,您将丢失尚未写入的所有内容。

    这样的问题的问题在于,它会让人们想知道你为什么要问。您是否试图成为一个可怕的人而不关闭你的作家?你真的一种情况,关闭作家是你不想做的事情吗?

    【讨论】:

      【解决方案3】:

      如果你不喜欢关闭流,那么使用try-with-resource,JDK 1.7引入的新特性,它将关闭所有实现Closable接口的对象

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-15
        • 2022-06-16
        • 1970-01-01
        • 2023-03-09
        相关资源
        最近更新 更多