这是java jdk中的一个错误吗?

2022-09-02 04:52:07

当我得到一个带有代码的java.lang.File类时,当然我得到了一个表示e:\目录。File file = new File("e:/");

但是,如果我得到了一个带有代码的File类,并且我只是在驱动器E:中,那么我就得到了一个表示当前目录的File类。File file = new File("e:");

假设我在目录 E:\dir\ 中,并且此目录有一个名为 Test.java。它的内容是:

import java.io.File;
public class Test {
    public static void main(String[] args) {
        File file = new File("e:"); 
        File[] files = file.listFiles(); 
        for(File f: files){ 
            System.out.println(f + " " + f.exists()); 
        }
    }
}

打开 cmd 工具并导航到目录 e:\dir,在其中执行以下命令:

E:\dir> javac Test.java
E:\dir> java Test

我得到了:

e:\Test.class false
e:\Test.java false

这是一个java jdk错误吗?


来自@JimGarrison的其他信息:

我运行此代码

public class Foo3
{
    public static void main(String[] args)  throws Exception
    {
        File f = new File("D:");
        System.out.println(f.getCanonicalPath());
        for (File x : f.listFiles())
            System.out.println(x + " " + x.getCanonicalPath() + " " + x.getAbsolutePath() + " " + x.exists() + " " + x.getAbsoluteFile().exists());
    }
}

在Eclipse中(它位于我的D:驱动器上),并获得了以下输出:

D:\dev\src\pdxep
D:\.classpath D:\dev\src\pdxep\.classpath D:\dev\src\pdxep\.classpath false true
D:\.project D:\dev\src\pdxep\.project D:\dev\src\pdxep\.project false true
D:\.settings D:\dev\src\pdxep\.settings D:\dev\src\pdxep\.settings false true
D:\gallery D:\dev\src\pdxep\gallery D:\dev\src\pdxep\gallery false true
D:\pom.xml D:\dev\src\pdxep\pom.xml D:\dev\src\pdxep\pom.xml false true
D:\src D:\dev\src\pdxep\src D:\dev\src\pdxep\src false true
D:\target D:\dev\src\pdxep\target D:\dev\src\pdxep\target false true

这证实了有一些有趣的事情正在发生。

Java Bug 8130462似乎与此相关,因为它与Windows中的相对路径与绝对路径有关。


答案 1

这不是一个错误。

  • E:/表示同时指定驱动器目录

  • E:表示您只指定一个驱动器,目录将保留为默认值。

注意:现在人们认为的当前目录实际上是默认目录。即,当未指定任何内容时默认应用的内容。如果您根本不指定驱动器,则同样,将应用默认值(当前默认值)。

这是它在大多数文件系统上的工作方式。


答案 2

关于获取一个用代码表示当前工作目录的第一部分不是 bug。这是一个Windows的“驱动器相对路径”。即,相对于指定驱动器中当前工作目录的路径。(是的,Windows 每个驱动器都有不同的工作控制器)FileFile file = new File("e:");

问题是Java错误地在路径中的驱动器号后面添加了一个,这使得路径看起来像一个绝对路径,并且可能因此错误地返回。\falsefile.exists()

但是,Java 可以正确解析规范路径和绝对路径,并在 上正确返回 true。Java 还可以正确返回 in 的内容,正如您在示例代码中注意到的那样。x.getAbsoluteFile().exists()CWDfile.listFiles()

我在数据库中发现了一个旧的错误,JDK-5066567关于这个或至少与此非常相似。它创建于2004年,并设置为2013年“进行中”,当前的受托人是“非活动”,所以我认为我们很快就会看到任何修复,如果有的话。

所以为了回答你的问题,我会说是的,这是一个错误。

但是,似乎在 中更好地处理它。因此,如果可以在您的用例中改用该软件包,则可能是一种可接受的解决方法。java.nio.file.Pathjava.nio.file.*