首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >这是java jdk中的一个bug吗?

这是java jdk中的一个bug吗?
EN

Stack Overflow用户
提问于 2016-03-25 09:50:28
回答 1查看 393关注 0票数 21

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

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

EN

回答 1

Stack Overflow用户

发布于 2016-03-25 18:56:58

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

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

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

我在数据库中发现了一个旧的bug,关于这个或者至少和这个非常相似的JDK-5066567。它创建于2004年,设置为“正在进行”2013年,而当前的Assignee是“非活动的”,所以我认为我们不会很快看到任何修复。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36212863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档