2016-11-18 25 views
0

我正在处理一个Java中的对象,它计算起来非常昂贵,而且它的大小是几兆字节。为了在应用程序重新启动时保留它,我想将它序列化为一个File,并在启动时重新加载该文件(如果存在)。Java:断言文件序列化已完成?

问题是大多数文件系统不是事务性的。文件写入过程可能因异常,JVM终止和/或电源故障而中断。我绝对需要声明的是,如果使用该文件,则内部信息是完成。如果需要,我可以丢弃信息并重新计算,但必须避免阅读和依赖不完整的数据。

我的尝试是序列化并在文件末尾写入“密封”对象,例如校验和。在反序列化过程中存在此对象可以确保序列化过程完成。如果在反序列化过程中密封对象不存在,我知道我不能信任文件中的数据,因为它可能不完整。我正在寻找一个独立于操作系统的解决方案,我不需要考虑恶意修改序列化文件内容的“攻击”。

我的问题是:是密封对象的方法概述上述安全,还是有一些仍然角落情况下,我最终会读不完整的文件没有注意到呢?

回答

5

只需在不同的临时名称下编写该文件即可。文件完成后,删除该文件的任何先前版本并将新文件重命名为真实名称。

如果程序在写入期间死亡,则只剩下一个不完整的临时文件。真正的文件仍然像以前一样(或缺少),所以你永远不会看到一个不完整的文件加载。

+0

非常好的主意,谢谢! – Alan47