java - 停电期间文件操作的执行方式
问题描述
Linux 机器,Java 独立应用程序
我有以下情况:
我有:连续文件写入(创建目标文件并向其中写入一些内容)和文件移动。
我还有一个断电问题,在这些操作过程中会立即切断计算机的电源。
结果,我得知文件已创建,并且也已移动,但文件内容为空。
问题是,究竟是什么导致了这个确切的结果?考虑到时间敏感性,可能是在切出过程中,在处理器和RAM之前禁用了硬盘,但是在那种情况下,怎么可能创建并移动了文件,但移动前的写入却没有成功?
我尝试捕获并记录异常和调试信息,但问题是断电也禁用了记录功能(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 以了解用于移动有关原子性的文件的方法。
推荐阅读
- docker - 升级 VM RAM 后 BigBlueButton 崩溃
- node.js - 无法将图像/视频文件从 react-native 上传到 nodejs
- reactjs - How can I call some code after a property on my state object has been defined?
- java - 在Java中将反向ASCII转换为整数十进制
- javascript - 如何强制用户在 Angular 中仅上传特定的文件类型
- elasticsearch - ElasticSearch 多个值作为输入(以及正则表达式)以匹配(应该)多个字段
- r - 如何在 R 中使用 fread 读取 .pgn.bz2 文件?
- c# - 如何将以下内容转换为 VB.NET(Where 子句)
- excel - 如何在 excel VBA 用户窗体中显示 excel 工作表图表
- python - 如何创建处理输入字符串或输入文件的 python 脚本?