Linux计算机,Java独立应用程序
我遇到以下情况:
我有: 连续文件写入(创建目标文件并向其中写入一些内容)并移动文件。
我还有一个停电问题,在执行这些操作时会立即切断计算机的电源。
结果,我得到了文件的创建,它也被移动了,但是文件内容为空。
问题是,到底是什么原因导致这种确切结果?考虑到时间敏感性,可能在剪切过程中在处理器和RAM之前禁用了硬盘驱动器,但是在那种情况下,怎么可能在之后创建和移动文件,但是在移动之前写入失败? >
我尝试捕获并记录异常和调试信息,但问题是断电也禁用了记录功能(I / O)。
try {
FileUtils.writeStringToFile(file, JsonUtils.toJson(object));
} finally {
if (file.exists()) {
FileUtils.moveFileToDirectory(file, new File(path), true);
}
}
答案 0 :(得分:1)
Linux文件系统不必立即将事情写到磁盘上,也不必按照您写它们的顺序来写。其中包括文件内容和文件/目录元数据。
因此,如果在错误的时间断电,您可能会发现文件数据和元数据不一致。
通常这无关紧要。 (如果电源出现故障并且您没有UPS,则应用程序将消失,而没有机会完成其工作。)
但是,如果有关系,您可以执行以下操作:在移动文件之前强制文件“同步”:
FileOutputStream fos = ...
// write to file
fs.getFD().sync();
fs.close();
// now move it
您需要仔细阅读sync()
的{{3}},以了解该方法的实际作用。
您还需要阅读用于移动有关原子性文件的方法的javadoc。