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\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”系统属性之外的其他路径来检查文件系统。

知道这个问题可能来自哪里吗?

回答:

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

回到顶部