2

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

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

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

4

2 回答 2

5

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

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

注意:虽然使用它似乎可行,但我相信它会在实现上遇到挑战,因为当你的关闭挂钩被调用时你的文件句柄是否过时。因此,更好的方法应该是在完成文件操作的代码中使用 finally 块优雅地关闭您的流。

于 2013-09-09T15:45:16.183 回答
1

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

想想Information Expert GRASP模式,操作 的代码BufferedWriter是包含有关操作何时完成并应该刷新的信息的地方,所以这就是逻辑应该去的地方。

如果某些应用程序组件在事情没有完成时正在调用System.exit,我会认为异常退出,不应该返回0,因此不应该保证流被刷新。

于 2013-09-09T15:45:31.430 回答