正如标题所说,在 Java 1.6 中File.renameTo()
,POSIX linux 上的原子操作?
根据此链接,POSIX Linux 中的重命名操作是原子的,但是,它适用true
于File.renameTo
吗?
对于 Linux,当且仅当源路径和目标路径位于同一挂载点(而不是文件系统)下时,重命名才是原子的。
File.renameTo()
本质上是对rename(2)
Linux 下的调用,因此您必须测试其返回值以查看文件是否可以重命名。
在 Java 7 中, dropFile
改为使用:
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)