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



>我有一个应用程序,它访问选定的文件并读取其中的数据(在我的情况下为文本(并进行一些计算,然后更新文本并将其重写到文件中。

该应用程序在访问文件和重写文件方面运行良好,除了一种情况

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

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

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

如果在写入文件时电源关闭,则无法保证1将完全写入文件。

您可以使用FileDescriptor.sync()来减少漏洞窗口(通过强制操作系统刷新对物理磁盘的写入(,但无法完全消除它。

但正如@creinig所说,执行此操作的正常方法是将数据写入临时文件,然后重命名临时文件。 许多操作系统可以通过原子方式执行文件重命名操作。


顺便说一句,你这样说:

这仅在使用台式计算机时发生(在笔记本电脑上不会发生(......

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

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

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

最新更新