java - 断电期间文件操作如何执行

标签 java linux operating-system filesystems

Linux 机器,Java 独立应用程序

我遇到以下情况:

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

我也遇到了断电问题,在这些操作过程中电脑的电源立即被切断。

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

问题是到底是什么导致了这个确切的结果?考虑到时间敏感性,可能是在剪切过程中在处理器和RAM之前禁用了硬盘,但这样的话,怎么可能文件创建并移动后,但移动前写入不成功?

我 try catch 并记录异常和调试信息,但问题是断电也会禁用日志记录功能(I/O)。

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

最佳答案

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

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

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

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

   FileOutputStream fos = ...

   // write to file

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

   // now move it

您需要阅读javadoc仔细了解 sync() 方法的实际用途。

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

关于java - 断电期间文件操作如何执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56546172/

相关文章:

linux - 如何屏蔽Linux调度程序中的CPU(防止将线程调度到该CPU上)?

linux - Makefile 变量替换显然没有完成,即使 := is used in declaration

linux - Shell 命令检查文件是否有今天的日期

Java:是否可以覆盖操作系统设置的最小窗口宽度?

java - 确定字符串是否只包含允许值的最快方法?

java - 如何向 Apache Flink 表添加新行

java - 如何关联不同 ArrayList 中的两个元素?

java - 向 h :dataTable via AJAX with request-scoped bean without losing the row data 添加一行

operating-system - 谁能向我解释一下编程语言中的系统调用?

c - 当想要将某些内容写入文件时,在操作系统级别会发生什么?