Java:断言文件序列化完成了吗?

Ala*_*n47 0 java filesystems atomic

我正在处理Java中的一个对象,它的计算成本非常高,而且大小只有几兆字节.为了在应用程序重新启动时保留它,我想将其序列化为a File,并在启动时重新加载该文件(如果存在).

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

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

我的问题是:上面列出的密封对象方法是否安全,或者是否仍有一些极端情况下我最终会在不注意的情况下读取不完整的文件?

And*_*eas 5

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

如果程序在写入期间死亡,那么你只剩下一个不完整的临时文件.真实文件仍然像以前一样(或丢失),因此您永远不会看到要加载的不完整文件.