我在Java中遇到了一种奇怪的行为
File file = new File("test.txt");
file.reName(new File("test1.txt"));
该文件已成功从test.txt
重命名为test1.txt
,但如果我这样做
System.out.println(file.getCanonicalPath()); //This return test.txt
这是预期的吗?什么是解决这个问题的简洁方法?
答案 0 :(得分:4)
是的,这是预料之中的。 File
个对象是不可变的,只是表示文件名。
您可以这样想:File
对象是对文件的引用,而不是文件本身。
此行为实际上很有用 - 例如,假设您正在移动文件的先前版本以避免覆盖它(即创建备份副本)。如果您将foo1.txt
重命名为foo1.bak
,则包含File
的原始foo1.txt
变量仍会包含该变量,并可用于打开FileOutputStream
。< / p>
答案 1 :(得分:1)
我相信这是预期的。 File对象是相对于底层文件系统的路径的抽象。它不需要对应于现有文件。 renameTo
方法移动基础文件(如果存在且可移动)。但是,这不会更改File对象表示的路径。