首页 > 解决方案 > 停电期间文件操作的执行方式

问题描述

Linux 机器,Java 独立应用程序

我有以下情况:

我有:连续文件写入(创建目标文件并向其中写入一些内容)和文件移动。

我还有一个断电问题,在这些操作过程中会立即切断计算机的电源。

结果,我得知文件已创建,并且也已移动,但文件内容为空。

问题是,究竟是什么导致了这个确切的结果?考虑到时间敏感性,可能是在切出过程中,在处理器和RAM之前禁用了硬盘,但是在那种情况下,怎么可能创建并移动了文件,但移动前的写入却没有成功?

我尝试捕获并记录异常和调试信息,但问题是断电也禁用了记录功能(I/O)。

try {
    FileUtils.writeStringToFile(file, JsonUtils.toJson(object));
} finally {
    if (file.exists()) {
        FileUtils.moveFileToDirectory(file, new File(path), true);
    }
}

标签: javalinuxoperating-systemfilesystems

解决方案


Linux 文件系统不一定会立即将内容写入磁盘,或者完全按照您写入它们的顺序。这包括文件内容和文件/目录元数据。

所以如果你在错误的时间断电,你可能会发现文件数据和元数据不一致。

通常这无关紧要。(如果电源出现故障并且您没有 UPS,应用程序就会消失而没有机会完成它们正在做的事情。)

但是,如果它确实重要,您可以执行以下操作:在移动文件之前强制文件“同步”:

   FileOutputStream fos = ...

   // write to file

   fs.getFD().sync();
   fs.close();

   // now move it

您需要仔细阅读javadocsync()了解该方法的实际作用。

您还需要阅读 javadoc 以了解用于移动有关原子性的文件的方法。


推荐阅读