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

时间:2011-09-06 13:08:41

标签: java io

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变量的正确方法是什么?目前我是这样做的:

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"
}

3 个答案:

答案 0 :(得分:14)

最简单的解释是,to quote the Javadoc

  

File类的实例是不可变的;也就是说,一旦创建,由File对象表示的抽象路径名将永远不会改变。

正如其他人所说,这里没有对错。但是,一旦图书馆的设计师做出上述选择,renameTo的当前行为就成为唯一可能的行为。

关于你的第二个代码片段,我看不出它有任何缺陷。

答案 1 :(得分:5)

File对象只是一个名称,它甚至不必存在。 renameTo API调用实际上重命名文件系统上的文件,但不会更改文件对象,因为这是API的目的。这里没有对错。 Sun的API设计师认为这种方式更有意义。

答案 2 :(得分:1)

从快速浏览到文件,它看起来像是不可变的。它有一些setter,但是它们在文件系统上的实际文件上运行,而不是在File实例上运行。

因此重命名不修改当前实例保持相同的样式。