【发布时间】:2016-07-12 19:00:09
【问题描述】:
当我得到一个代码为File file = new File("e:/"); 的java.lang.File 类时,当然我得到了一个代表e:\ 目录的File 类。
但是,如果我得到一个代码为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 似乎与 Windows 中的相对路径和绝对路径有关。
【问题讨论】:
-
很好奇。我也可以重现这个问题。
-
我运行了上面写的程序(尽管我将类名修改为 TestFile),并收到了 e: 驱动器(Windows 10)的预期输出(列出的文件和目录等)。运行 Java 1.8.0_72。 @JimGarrison 很有趣你重现了这个问题。从 Eclipse 和命令行运行它。唯一的区别是我有一个包名,所以它是 java -cp ./bin package.TestFile
-
如果您在调试器中运行并在
println处停止,您可以看到路径和规范路径之间存在差异。您看到的输出(缺少当前目录)似乎是用于查找文件的内容,但打印规范路径包括当前目录。当然看起来像一个错误(可能在 Windows 文件系统提供程序的实现中)。从显式完整路径字符串创建文件没有这个问题。 -
@KevinO 也许您是从根目录运行而不是从根目录运行的文件夹?我也可以复制——非常奇怪。我同意这是 FileSystem 中的一个问题,因为 File c'tor 中的第一行是 this.path = fs.normalize(pathname); 其中 fs 是 FileSystem跨度>
-
我已经用更多信息更新了这个问题。由于
File中至少有一个长期存在的错误与绝对路径与相对路径有关,我怀疑这是另一个(或现有错误的结果,在我对问题的更新中链接)。