Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.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 1.6文件中,linux上的.renameTo()原子?_Java_Linux_Posix_Rename_Atomic - Fatal编程技术网

在Java 1.6文件中,linux上的.renameTo()原子?

在Java 1.6文件中,linux上的.renameTo()原子?,java,linux,posix,rename,atomic,Java,Linux,Posix,Rename,Atomic,正如标题所说,在Java 1.6File.renameTo()POSIX linux上的原子操作 根据,POSIX Linux中的重命名操作是原子的,但是,对于File.rename to?对于Linux,当且仅当源路径和目标路径位于同一装载点(而不是文件系统)下时,重命名才是原子的 File.renameTo()本质上是在Linux下对rename(2)的调用,因此您必须测试其返回值,以查看是否可以重命名该文件 对于Java 7,删除文件,改为使用: Files.move(src, dst,

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


根据,POSIX Linux中的重命名操作是原子的,但是,对于
File.rename to

对于Linux,当且仅当源路径和目标路径位于同一装载点(而不是文件系统)下时,重命名才是原子的

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

对于Java 7,删除
文件
,改为使用:

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)

“根据这些链接”感谢您的回复。你有支持这一点的证明吗?谢谢。再一次。这是我假设File.renameTo正在使用的,但我找不到支持该语句的链接。您对此有何想法?另外,您可以
strace
一个简单的主程序,它执行
.renameTo()
。请参见编辑:我提供了一个示例Java文件和相关跟踪