刷新Java应用程序退出

时间:2013-09-09 15:42:18

标签: java exit bufferedwriter

假设Java应用程序使用BufferedWriter API写入文件(并且在每flush之后不调用write)。我想如果应用程序以System.exit退出,则缓冲区不会被刷新,因此文件可能已损坏。

假设决定退出的应用程序组件不知道写入文件的组件。

解决“冲洗问题”最简单,最正确的方法是什么?

2 个答案:

答案 0 :(得分:4)

您可以使用Runtime.addShutdownHook方法,该方法可用于添加jvm关闭挂钩。这基本上是一个未启动的Thread,它在关闭Java虚拟机时执行。

因此,如果您拥有该线程可用文件的句柄,那么您可以尝试关闭该流并刷新输出。

注意:尽管使用它似乎是可行的,但我相信会遇到实施方面的挑战,因为在调用shutdown hook时你的文件句柄是否过时。因此,更好的方法应该是在文件操作完成的代码中使用finally块优雅地关闭流。

答案 1 :(得分:1)

您可以添加关闭挂钩,但需要引用其中每个BufferedWriter或其他FlushableClosable个对象。你不会从中获得任何东西。您应该直接在操作对象的代码中执行close()flush()

考虑Information Expert GRASP模式,操作BufferedWriter的代码是具有关于操作何时完成并且应该被刷新的信息的位置,因此这就是逻辑的位置应该去。

如果某些应用程序组件在未完成任务时调用System.exit,我会认为异常退出不应返回0,因此不应保证流已刷新