Java:设置“ user.dir”时File.exists()不一致
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\subsub_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\subsub_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”系统属性之外的其他路径来检查文件系统。
知道这个问题可能来自哪里吗?
回答:
user.dir
不支持该设置。应该将其视为只读属性。
例如,在Sun Bug Parade中对Bug
4117557的评估包含以下文本:
在jvm启动过程中初始化的“ user.dir”应该用作信息/只读系统属性,尝试通过命令行对其进行自定义-Duser.dir =
xyz将最终导致实现dependend /未指定行为。
虽然此文本是关于在命令行上进行设置的,但是通过via进行设置很setProperty()
可能同样是未定义的。
当您 user.dir
手动设置即可重现该问题时,那么您发现了一个真正的问题。
以上是 Java:设置“ user.dir”时File.exists()不一致 的全部内容, 来源链接: utcz.com/qa/399548.html