假设Java应用程序使用BufferedWriter
API写入文件(并且在每flush
之后不调用write
)。我想如果应用程序以System.exit
退出,则缓冲区不会被刷新,因此文件可能已损坏。
假设决定退出的应用程序组件不知道写入文件的组件。
解决“冲洗问题”最简单,最正确的方法是什么?
答案 0 :(得分:4)
您可以使用Runtime.addShutdownHook方法,该方法可用于添加jvm关闭挂钩。这基本上是一个未启动的Thread,它在关闭Java虚拟机时执行。
因此,如果您拥有该线程可用文件的句柄,那么您可以尝试关闭该流并刷新输出。
注意:尽管使用它似乎是可行的,但我相信会遇到实施方面的挑战,因为在调用shutdown hook时你的文件句柄是否过时。因此,更好的方法应该是在文件操作完成的代码中使用finally块优雅地关闭流。
答案 1 :(得分:1)
您可以添加关闭挂钩,但需要引用其中每个BufferedWriter
或其他Flushable
或Closable
个对象。你不会从中获得任何东西。您应该直接在操作对象的代码中执行close()
和flush()
。
考虑Information Expert
GRASP模式,操作BufferedWriter
的代码是具有关于操作何时完成并且应该被刷新的信息的位置,因此这就是逻辑的位置应该去。
如果某些应用程序组件在未完成任务时调用System.exit
,我会认为异常退出不应返回0
,因此不应保证流已刷新强>