这是java jdk中的错误吗?

时间:2016-03-25 01:50:28

标签: java windows file

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

但是如果我得到一个代码为File file = new File("e:");的File类而且我只是在驱动器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()); 
        }
    }
}

打开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中的相对vs绝对路径有关。

2 个答案:

答案 0 :(得分:1)

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

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

但是,Java正确解析了规范路径和绝对路径,并在CWD上正确返回true。正如您在示例代码中所注意到的,Java还正确地返回file.listFiles()java.nio.file.Path的内容。

我在数据库中发现了一个旧的错误JDK-5066567,或者至少与此类似。它创建于2004年,并设置为"正在进行中" 2013年和现任受让人是#34;非活动"所以,如果有的话,我认为我们很快就会看到任何解决办法。

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

然而,似乎在java.nio.file.*处理得更好。因此,如果可以在您的用例中使用$this->context->controller->addCSS包,则可能是一种可接受的解决方法。

答案 1 :(得分:1)

这不是一个错误。

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

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

注意:现在人们认为当前目录实际上是默认目录。即,当没有指定时默认应用什么。 如果你根本没有指定驱动器,它就是一样的,默认(当前默认值)将适用。

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