Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java原子文件移动在断电时复制文件_Java_Linux_Debian_Filesystems_Ext4 - Fatal编程技术网

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

Java原子文件移动在断电时复制文件,java,linux,debian,filesystems,ext4,Java,Linux,Debian,Filesystems,Ext4,Java应用程序按以下方式移动原子文件: Path source = Paths.get(fullFileName + ".tmp"); Path target = Paths.get(fullFileName); Files.delete(target); Files.move(source, target, StandardCopyOption.ATOMIC_MOVE); 源文件存在或在移动之前创建。 源和目标位于同一位置,因此具有相同的FileSystemProvider。 使用原子移

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
我错过什么了吗?
这是否意味着不支持原子移动?

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

  • 只有移动是原子的。文件处理的其余部分不可用
  • 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点中断,您将只有一个文件,但是如果电源中断,那么当文件系统恢复时,将不再保证文件系统的状态


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

    你有linux标签;这到底有什么关系?操作系统与此相关吗?这个问题是linux独有的吗?没有迹象表明这个问题是特定于操作系统的。我只是列出了所有与这个问题有关的内容,实际上源文件是在3点创建的,但我明白你的意思。在创建源文件之后和删除目标文件之前,这两个文件都存在。