gpt4 book ai didi

设置 "user.dir"时 Java : File. exists() 不一致

转载 作者:行者123 更新时间:2023-11-29 09:12:45 24 4
gpt4 key购买 nike

JRE 6,在 Windows XP 上。

用不同的构造函数实例化两个 File 对象会导致 File.exists() 方法中的结果不一致。

免责声明: 下面的代码是抽象的,不是实际的代码。我根本不相信这是一个 File.separator 问题。我首先要求得到早期的 react ,以防我错过了一个很好理解的问题。 现在看来,重置 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 结果现在在机器之间是一致的。

现在,如果您通过从命令行调用 java 来重新执行该类,从一个包含 tmp/sub 子文件夹架构的文件夹(就像您从 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。它应被视为只读属性。

例如Bug 4117557的评价在 Sun Bug Parade 中包含以下文本:

"user.dir", which is initialized during jvm startup, should be used as aninformative/readonly system property, try to customize it via command line-Duser.dir=xyz will end up at implementation dependend/unspecified behavior.

虽然本文是关于在命令行上设置它,但通过 setProperty() 设置它很可能同样是未定义的。

当您可以手动设置user.dir 重现问题时,您就发现了真正的问题。

关于设置 "user.dir"时 Java : File. exists() 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11393065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com