停电期间文件操作如何执行

时间:2019-06-11 14:37:16

标签: java linux operating-system filesystems

Linux计算机,Java独立应用程序

我遇到以下情况:

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

我还有一个停电问题,在执行这些操作时会立即切断计算机的电源。

结果,我得到了文件的创建,它也被移动了,但是文件内容为空。

问题是,到底是什么原因导致这种确切结果?考虑到时间敏感性,可能在剪切过程中在处理器和RAM之前禁用了硬盘驱动器,但是在那种情况下,怎么可能在之后创建和移动文件,但是在移动之前写入失败? >

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

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

1 个答案:

答案 0 :(得分:1)

Linux文件系统不必立即将事情写到磁盘上,也不必按照您写它们的顺序来写。其中包括文件内容和文件/目录元数据。

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

通常这无关紧要。 (如果电源出现故障并且您没有UPS,则应用程序将消失,而没有机会完成其工作。)

但是,如果有关系,您可以执行以下操作:在移动文件之前强制文件“同步”:

   FileOutputStream fos = ...

   // write to file

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

   // now move it

您需要仔细阅读sync()的{​​{3}},以了解该方法的实际作用。

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