Als ich eine java.lang.File-Klasse mit dem Code File file = new File("e:/");
bekam, bekam ich natürlich eine File-Klasse, die das e: \ -Verzeichnis darstellt.Ist das ein Fehler in Java jdk?
Aber wenn ich eine File-Klasse mit Code File file = new File("e:");
bekommen habe und ich gerade in das Laufwerk E :, dann habe ich eine File-Klasse repräsentiert aktuelles Verzeichnis.
Angenommen, ich bin im Verzeichnis E: \ dir \, und dieses Verzeichnis hat eine Datei namens Test.java. Es ist Inhalt ist:
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());
}
}
}
Öffnen Sie das cmd-Tool und in das Verzeichnis e navigieren: \ dir, führen Sie den folgenden Befehl in es:
E:\dir> javac Test.java
E:\dir> java Test
Ich habe:
e:\Test.class false
e:\Test.java false
Ist das ein Java Jdk Bug?
Zusätzliche Informationen aus @JimGarrison:
lief ich diesen Code
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());
}
}
in Eclipse (die auf meinem D lebt: Laufwerk) und bekam die folgende Ausgabe:
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
Was bestätigt, dass etwas lustiges vor sich geht.
Java Bug 8130462 scheint verwandt zu sein, da es mit relativen vs absolute Pfade speziell in Windows zu tun hat.
Sehr neugierig. Ich kann das Problem auch reproduzieren. –
Ich habe das Programm wie oben beschrieben ausgeführt (obwohl ich den Klassennamen in TestFile geändert habe) und die erwartete Ausgabe (Dateien und Verzeichnisse usw.) für das Laufwerk e: (Windows 10) erhalten. Java 1.8.0_72 ausführen. @ JimGarrison ist es interessant, dass Sie das Problem reproduziert. Lief es sowohl innerhalb von Eclipse als auch an der Kommandozeile. Der einzige Unterschied ist, dass ich einen Paketnamen hatte, also war es java -cp ./bin package.TestFile – KevinO
Wenn Sie in einem Debugger laufen und bei der 'println' stoppen, können Sie sehen, dass es einen Unterschied zwischen dem Pfad und dem kanonischen Pfad gibt. Die Ausgabe, die Sie sehen (das aktuelle Verzeichnis fehlt), scheint das zu sein, was verwendet wird, um nach der Datei zu suchen, aber das Drucken des kanonischen Pfads enthält das aktuelle Verzeichnis. Sicher sieht es aus wie ein Bug (wahrscheinlich in der Implementierung des Windows-Dateisystem-Providers). Das Erstellen einer Datei aus einer expliziten vollständigen Pfadzeichenfolge hat dieses Problem nicht. –