我正在为Java中的图形应用程序添加自动保存功能.应用程序定期自动保存当前文档,并在退出时自动保存.当用户启动应用程序时,将重新加载自动保存文件.
如果自动保存文件以任何方式损坏(我假设当文件处于保存状态时断电会这样做吗?),用户将失去工作.如何防止这种情况并尽我所能保证自动保存文档处于一致状态?
更复杂的是,要自动保存文档,我需要保存一个.xml文件和几个.png文件.此外,.png保存发生在JNI的C代码中.
我当前的策略是使用扩展名.png.tmp编写每个.png,编写扩展名为.xml.tmp的.xml文件,然后重命名每个文件以删除.tmp部分,直到最后一个.xml.在启动时,我只加载自动保存文件,如果我能找到.xml文件并忽略.xml.tmp文件.在重命名新文档的.xml.tmp文件之前,我也不会删除以前的自动保存文档.
我想我对写入磁盘时会发生什么的了解很少.我知道在使用文件时,您可以拥有软件读/写缓冲区,以及操作系统和硬件缓冲区,并且所有这些都需要刷新.我很困惑如何确切地知道什么东西真的被写入磁盘以及我可以做些什么来保护自己.重命名操作是否会执行任何操作以确保刷新缓冲区?
解决方法:
If the autosave file is corrupted in any way (I assume a power cut when the file is in the middle of being saved would do this?), the user will lose their work. How can I prevent such situations and do all I can to guarantee that the autosave document is in a consistent state?
为防止因部分写入的自动保存文件而导致数据丢失,请勿覆盖自动保存文件.而是每次都写入一个新文件,然后在文件安全写入后重命名.
为了防止没有注意到自动保存文件未正确写入:
>注意在写入和关闭自动保存文件时抛出的异常,以防光盘错误,文件系统已满等.
>在文件写入时保持文件的运行校验和,并将其写在文件末尾.然后,当您加载自动保存文件时,检查校验和是否存在且是否正确.
如果检查点状态涉及多个文件,请确保以众所周知的顺序编写文件(不覆盖!),并在安全关闭所有其他文件后在自动保存文件上写入校验和.您可能希望为每个检查点创建一个目录.
跟进
不,我不是说重命名总是成功的.但是,它是原子的 – 它要么成功(并完成),要么文件系统不会更改.所以,如果你这样做:
>写“file.new”并关闭,
>删除“文件”,
>将“file.new”重命名为“file”
然后提供第一步成功,你保证在光盘上安全地拥有最新的“文件”.添加几个步骤很简单,这样您就可以随时备份“文件”. (如果第3步失败,则会留下“file.new”而没有“文件”.这可以手动恢复,也可以在下次运行时由应用程序自动恢复.)
此外,我并不是说写入总是成功,或者应用程序不会崩溃,或者说电源永远不会消失.校验和的要点是允许您检测发生这些事情并且自动保存文件不完整的情况.
最后,如果您的应用程序进入一个状态,其数据结构混乱并且最后一次自动保存结果是无意义的,那么最好有两个自动保存. (校验和不会防止这种情况.)当应用程序因同样的原因崩溃时要小心自动保存.
标签:java,file,serialization,file-io,operating-system
来源: https://codeday.me/bug/20190526/1157691.html