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

Bli*_*lin 16 java io

File oldFile = new File("old");
if (oldFile.renameTo(new File("new"))){
    System.out.println(oldFile.getName());//this prints "old"
}
Run Code Online (Sandbox Code Playgroud)

我查看了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);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

所以路径变量永远不会改变.为什么会这样?使用重命名的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"
}
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 14

最简单的解释是引用Javadoc:

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

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

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


Omr*_*dan 5

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