Windows XP上的JRE 6。
实例化具有不同构造函数的两个File对象会导致File.exists()方法中的结果不一致。
免责声明: 下面的代码是抽象的,而不是实际的代码。
我根本不相信这是File.separator的问题。我首先要求早日做出反应,以防万一我错过了一个众所周知的问题。现在看来,重置user.dir系统属性是导致此问题的原因之一。现在,下面的代码可以复制和使用。您可以复制/粘贴Java类并进行尝试,它的行为应与我列出的结果一致。
建立:
创建文件夹架构C:\toto\tmp\sub。
从不包含tmp/sub子文件夹体系结构的任何文件夹中启动以下类。
码:
public class TestFileExists {
public static void main(String[] args) {
System.setProperty("user.dir", "C:\\toto\\");
File root = new File("tmp");
File sub_a = new File(root, "sub");
File sub_b = new File(root.getAbsolutePath()+"/sub");
System.out.println("sub_a path ? "+sub_a.getAbsolutePath());
System.out.println("sub_a exists ? "+sub_a.exists());
System.out.println("sub_b path ? "+sub_b.getAbsolutePath());
System.out.println("sub_b exists ? "+sub_b.exists());
System.out.println("Path equals ? "+ (sub_a.getAbsolutePath().equals(sub_b.getAbsolutePath())));
System.out.println("Obj equals ? "+ (sub_a.equals(sub_b)));
}
}
结果:
sub_a path ? C:\toto\tmp\sub
sub_a exists ? false
sub_b path ? C:\toto\tmp\sub
sub_b exists ? true
Path equals ? true
Obj equals ? false
我不明白这行sub_a exists ? false, 结果在机器之间也不一致,也与根初始路径 ant不一致,结果现在在机器之间不一致。
现在,如果您通过从包含tmp/sub子文件夹体系结构的文件夹中的命令行调用java重新执行该类(例如,如果从D:\,具有调用D:\tmp\sub),您将得到预期的结果:
sub_a path ? C:\toto\tmp\sub
sub_a exists ? true
sub_b path ? C:\toto\tmp\sub
sub_b exists ? true
Path equals ? true
Obj equals ? false
但是存在的存在sub_a显然是错误肯定的,因为它会检查除所描述的文件夹以外的其他文件夹的存在getAbsolutePath()。
因此,我强烈怀疑这File.exists()取决于实际的Java执行路径,并且该文件存在与绝对路径不一致,并且exists()使用除“
user.dir”系统属性之外的其他路径来检查文件系统。
知道这个问题可能来自哪里吗?