在Java 1.6中Linux上的File.renameTo()原子吗? [英] In Java 1.6 File.renameTo() atomic on linux?

查看:281
本文介绍了在Java 1.6中Linux上的File.renameTo()原子吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

正如标题所述,在Java 1.6 File.renameTo()中,是POSIX linux上的原子操作吗?

As the title says, in Java 1.6 File.renameTo() an atomic operation on POSIX linux?

根据此链接,POSIX Linux中的重命名操作是原子的,但是,对于FIle.renameTo是否成立?

According to this link, the rename operation in POSIX Linux is atomic, however, does it hold true for FIle.renameTo?

推荐答案

在Linux中,当且仅当源路径和目标路径在同一装载点下时,重命名为原子 (不是文件系统).

With Linux, the rename is atomic if and only if the source path and target path are under the same mount point (not filesystem).

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

File.renameTo() is essentially a call to rename(2) under Linux, so you'll have to test for its return value to see if the file could be renamed.

对于Java 7,请放下File,而应使用:

With Java 7, drop File, instead use:

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


这里是一个例子.在我的系统上,/home是与/不同的挂载点,因此第一个重命名将成功(相同的文件系统),第二个重命名将失败:


Here is an example. On my system, /home is a different mount point to /, so the first rename will succeed (same filesystem), the second rename fails:

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)

这篇关于在Java 1.6中Linux上的File.renameTo()原子吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆