当我得到一个代码为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绝对路径有关。
答案 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:
表示您只指定了一个驱动器,目录保留为默认值。
注意:现在人们认为当前目录实际上是默认目录。即,当没有指定时默认应用什么。 如果你根本没有指定驱动器,它就是一样的,默认(当前默认值)将适用。
这是它在大多数文件系统上的工作方式。