gpt4 book ai didi

Java 原子文件在断电时移动重复文件

转载 作者:行者123 更新时间:2023-11-30 01:44:17 25 4
gpt4 key购买 nike

Java 应用程序按以下方式移动原子文件:

Path source = Paths.get(fullFileName + ".tmp");
Path target = Paths.get(fullFileName);

Files.delete(target);
Files.move(source, target, StandardCopyOption.ATOMIC_MOVE);

源文件在移动之前已存在或创建。源和目标位于同一位置,因此具有相同的 FileSystemProvider。使用原子移动选项,我希望在任何给定时刻系统中仅存在一个文件,否则会抛出异常。

尽管如此,当发生断电时,我发现驱动器上的源文件和目标文件具有相同的内容。我不排除其他潜在问题,但到目前为止,它确实会留下重复项。

File system: EXT4
Storage type: eMMC Flash
CPU Architecture: ARM
OS: Debian 4.9.11-02300-ga1ac172-dirty #2 SMP PREEMPT Mon Apr 23 12:58:56 CDT 2018 armv7l GNU/Linux

我错过了什么吗?这是否意味着不支持原子移动?

最佳答案

我认为您误解了原子移动是什么:

  1. 只有移动是原子的。其余的文件处理则不然。
  2. POSIX 原子性保证适用于正常运行的软件,而不是断电情况。

考虑你的代码:

void foo(String fullFileName) {
// 1
Path source = Paths.get(fullFileName + ".tmp");
// 2
Path target = Paths.get(fullFileName);
// 3
Files.delete(target);
// 4
Files.move(source, target, StandardCopyOption.ATOMIC_MOVE);
// 5
}

如果程序在 1、2 或 3 处中断,则将这两个文件保留在系统上。您的原子移动尚未被调用,因此在那里进行移动不会产生任何影响。

如果程序在 4 或 5 处中断,您将只有一个文件,但如果电源中断,则不再保证文件系统恢复时的状态。

听起来您想要的是一个支持事务的数据库。

关于Java 原子文件在断电时移动重复文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58736316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com