Java原子文件移动在断电时复制文件
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。 使用原子移
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
我错过什么了吗?
这是否意味着不支持原子移动?我认为您误解了原子移动是什么:
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点创建的,但我明白你的意思。在创建源文件之后和删除目标文件之前,这两个文件都存在。