在Java 1.6中File.renameTo()在linux上是原子的吗?

2024-01-12

正如标题所说,在Java 1.6中File.renameTo()POSIX Linux 上的原子操作?

根据这个链接 http://linux.die.net/man/2/rename,POSIX Linux 中的重命名操作是原子的,但是它成立吗true for File.renameTo?


对于 Linux,重命名是原子的当且仅当源路径和目标路径在同一目录下挂载点(不是文件系统)。

File.renameTo()本质上是一个调用rename(2)在 Linux 下,因此您必须测试其返回值以查看该文件是否可以重命名。

对于 Java 7,删除File,而是使用:

Files.move(src, dst, StandardCopyOption.ATOMIC_MOVE);

这是一个例子。在我的系统上,/home是一个不同的安装点/,因此第一次重命名将成功(同一文件系统),第二次重命名失败:

fge@alustriel:~/tmp/t$ cat Rename.java 
import java.io.File;

public final class Rename
{
    private Rename()
    {
    }

    public static void main(final String... args)
    {
        final File f1 = new File("/home/fge/tmp/t/foo");
        final File f2 = new File("/home/fge/tmp/t/bar");
        final File f3 = new File("/tmp/foo");

        if (f1.renameTo(f2))
            f2.renameTo(f3);
    }
}

fge@alustriel:~/tmp/t$ javac Rename.java
fge@alustriel:~/tmp/t$ strace -ff -o TRACE java Rename
fge@alustriel:~/tmp/t$ grep -w rename TRACE.*
TRACE.17107:rename("/home/fge/tmp/t/foo", "/home/fge/tmp/t/bar") = 0
TRACE.17107:rename("/home/fge/tmp/t/bar", "/tmp/foo") = -1 EXDEV (Invalid cross-device link)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Java 1.6中File.renameTo()在linux上是原子的吗? 的相关文章

随机推荐