当前位置: 首页 > 面试题库 >

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

慕容齐智
2023-03-14
问题内容

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 7中等效方法的实际用例。看来,或会在所有情况下最好(或,等等)。 例如,如何检查Java中是否存在文件?,第二个答案指出,接受的答案似乎很愚蠢。 任何人都可以举一个例子,在 不 知道某物是文件还是目录的 情况 下,知道某物存在是有用的吗? 编辑:我知道做什么。我的问题是,该功能 何时 能帮助某人?我正在搜索一个示例,例如“ 在_ _ _ _ _时使用,因为在

  • 问题内容: 我想知道如何运作。我不太了解文件系统的工作原理,所以我应该首先开始阅读。 但是为了获得快速的预先信息: 如果在某个日志中注册了该路径和文件名,是否调用文件系统的单个操作?还是操作系统获取目录的内容,然后在目录中进行扫描以进行匹配? 我认为这将取决于文件系统,但是也许所有文件系统都使用快速方法? 我不是在谈论网络和磁带系统。让我们将其保留到ntfs,extX,zfs,jfs :-) 问题

  • 问题内容: 我从没想过会发生这种情况,但是遇到了我的第一个Java错误: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5003595 我几乎与错误(在Linux上为NFS)中描述的情况完全相同,并且我看到File.exists()没有返回正确的值(至少不是立即返回)。 所以我的问题是,这种检查文件是否存在的方法是否可以替代?如果可能的话,我

  • 我正在尝试一些方法和一个动作/“命令”的响应,可以每周使用一次(垃圾邮件预防)。我唯一的问题是如何将我的java时间设置为一周。这就是我所拥有的: 方法: 我想把“星期”时间改成displayTime=System。currentTimeMillis()(1000*60*60);。我相信(1000*60*60)是24小时,对吗?这是我唯一的问题。解决此问题后,用户每周只能使用该命令一次。命令就在这

  • 我正试图在我的Fedora 22上安装MATLAB。最后,我得到一个错误 应用程序遇到意外错误,需要关闭。您可能需要尝试重新安装产品。更多信息可以在 /tmp/mathworks_root.log找到 当我查看mathworks_root.log文件时,我发现在安装步骤中未正确设置Java Home Java Home /tmp/mathworks_32206/sys/java/jre/glnxa

  • 问题内容: 当我尝试从Java代码中删除tomcat服务器conf / Catalina / localhost中存在的文件时,file.delete()始终返回false。但是,如果我通过file.exists()函数检查文件,它将返回true。我没有任何例外。请帮助我们为什么会这样。有什么解决方案? 问题答案: 当我尝试从Java代码中删除tomcat服务器conf / Catalina /