【发布时间】:2011-01-17 12:52:34
【问题描述】:
JRE 6,在 Windows XP 上。
用不同的构造函数实例化两个 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”系统属性以外的其他路径检查文件系统。
知道这个问题可能来自哪里吗?
【问题讨论】:
-
猜想:中间目录上的一些属性搞砸了,它会被绝对路径遍历。
-
在带有 JDK 1.6.0_16 和 Java 1.6.0_18 的 Windows XP 上,我明白了,真的。真假。话虽如此,我的目录没有任何空格、特殊字符或拒绝权限。
标签: java filesystems