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

2022-09-03 06:09:51
File oldFile = new File("old");
if (oldFile.renameTo(new File("new"))){
    System.out.println(oldFile.getName());//this prints "old"
}

我看过openJDK源代码,那里有repedTo(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"
}

答案 1

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

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

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

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


答案 2

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


推荐