Java 断电时文本文件被清空并丢失所有数据

Text file gets emptied and loses all of its data when the power cuts in Java

我有一个应用程序可以访问选定的文件并读取其中的数据(在我的例子中是文本)并进行一些计算,然后更新文本并将其重写到文件中。

应用程序在访问文件和重写文件方面工作得非常好,除了一种情况

情况是这样的:如果用户使用桌面并且如果用户触发导致文件操作(读取和写入)的事件并且同时断电然后再次启动桌面后文件仍然存在存在但里面没有数据(完全清空)

请记住,这只会在使用台式机时发生(在笔记本电脑上不会发生),并且只会在断电前一瞬间触发文件操作时发生。

我想知道 java 中是否有任何解决方法来防止发生这种事情,我知道这种情况发生的可能性非常低,但它确实发生了,这就是我在这里的原因。

对此的经典解决方案是将更改的内容写入临时文件,然后将临时文件重命名为正确的名称。这样中断 (a) 将临时文件留空,原始文件保持不变,或者 (b) 导致临时文件不被重命名,原始文件保持不变。

如果在写入文件时断电,无法保证1文件会被完全写入。

您可以使用 FileDescriptor.sync() 来减少漏洞的 window(通过强制 OS 将写入刷新到物理磁盘),但您无法完全消除它。

但是正如@creinig所说,正常的做法是将数据写入临时文件,然后重命名临时文件。许多 OSes 可以自动执行文件重命名操作。


顺便说一句:

This is only happening when using a desktop computer (it doesn't occur on laptops) ...

膝上型电脑通常有电池,不易受到物理断电的影响。当您按下笔记本电脑上的电源关闭按钮时,OS 可能有机会在笔记本电脑关闭之前刷新文件系统。

1 - 当然不是传统的文件系统。事务文件系统(例如 Transactional NTFS)可能会提供一些保证,但我不确定 Java 运行时是否理解这一点。