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/