【问题标题】:In Java 1.6 File.renameTo() atomic on linux?在 Linux 上的 Java 1.6 File.renameTo() 原子?
【发布时间】:2013-07-16 22:43:30
【问题描述】:

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

根据this link,POSIX Linux 中的重命名操作是原子的,但是对于File.renameTo,它是否持有true

【问题讨论】:

  • “根据这些链接”

标签: java linux posix rename atomic


【解决方案1】:

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

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

对于 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)

【讨论】:

  • 感谢您的回复。您有任何参考资料来支持这一点吗?
  • 谢谢。再次。这就是我假设 File.renameTo 正在使用的内容,但我找不到支持该声明的链接。对此有什么想法吗?
  • 另外,您可以strace 一个简单的主程序,它执行.renameTo()
  • 查看编辑:我提供了一个示例 Java 文件和相关的跟踪
猜你喜欢
  • 2012-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2014-09-21
  • 2010-12-05
  • 2012-08-20
  • 2019-10-01
  • 1970-01-01
相关资源
最近更新 更多