为什么File.renameTo不会改变File指向的位置?

16
File oldFile = new File("old");
if (oldFile.renameTo(new File("new"))){
    System.out.println(oldFile.getName());//this prints "old"
}

我查看了openJDK的源代码,其中renameTo(File dest)函数的代码如下:

public class File implements Serializable, Comparable<File> {
    static private FileSystem fs = FileSystem.getFileSystem();
    private String path;
    ...
    public boolean renameTo(File dest) {
        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            security.checkWrite(path);
            security.checkWrite(dest.path);
        }
        return fs.rename(this, dest);
    }
    ...
}
所以路径变量永远不会改变。为什么会这样?正确使用重命名的文件变量的方法是什么?目前我是这样做的:
File oldFile = new File("/home/blin/misk/old");
File newFile = new File("/home/blin/misk/new");
if (oldFile.renameTo(newFile)){
    oldFile=newFile;
    System.out.println(oldFile.getName());//this prints "new"
}

你在上一个示例中做得很正确。 - Marcelo
文件是路径的不可变名称。它不必存在,也不会改变。 - Peter Lawrey
3个回答

16
最简单的解释是,引用Javadoc的话来说

File 类的实例是不可变的;也就是说,一旦创建了一个 File 对象所表示的抽象路径名,就无法更改。

正如其他人所说,这里没有对错之分。然而,一旦库的设计者做出了上述选择,renameTo 的当前行为便成为唯一可能的行为。
至于你的第二个代码片段,我看不出任何缺陷。

6
一个File对象只是一个名字,它甚至不需要存在。renameTo API调用实际上重命名了文件系统上的文件,但并不改变File对象,因为这就是API的设计意图。这里没有对错之分。Sun公司的API设计人员认为以这种方式更有意义。

我相信我曾经听到Sun的某个人讨论过他们应该将类名命名为“Path”而不是“File”,以更好地澄清这一点... - Adam Paynter

1

从快速浏览文件来看,它似乎是不可变的。它有一些setter,但它们操作的是文件系统上的实际文件,而不是File实例。

因此,重命名而不修改当前实例保持相同的风格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接