这是java jdk中的错误吗?

xue*_*est 21 java windows file

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

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

假设我在目录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()); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

E:\dir> javac Test.java
E:\dir> java Test
Run Code Online (Sandbox Code Playgroud)

我有:

e:\Test.class false
e:\Test.java false
Run Code Online (Sandbox Code Playgroud)

这是一个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());
    }
}
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

这证实了有趣的事情发生了.

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

gus*_*stf 1

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

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

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

我在数据库中发现了一个旧错误,JDK-5066567关于此或至少与此非常相似。它创建于 2004 年,并在 2013 年设置为“进行中”,当前的受让人处于“不活动”状态,因此我认为我们不会很快看到对此问题的任何修复(如果有的话)。

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

不过,似乎在 中处理得更好java.nio.file.Path。因此,如果可以java.nio.file.*在您的用例中使用该包,那么这可能是一个可以接受的解决方法。