java: neue Datei("", "name") != neue Datei("name") ? (Datei-Konstruktor mit leerer string)
Aufgefallen heute.
Gegeben, dass eine Datei mit dem Namen "vorhandenen" besteht in der PWD von einem java-Prozess (windows).
new File("existing").exists() => true
new File("", "existing").exists() => false
new File(".", "existing").exists() => true
Ich würde erwartet haben, von der javadoc, dass die systemabhängigen Standard-Verzeichnis wäre dann "." und diese alle wahr sein, damit diese unerwartete.
Gedanken?
Dank!
-roger-
- Was bekommen Sie, wenn Sie drucken
new File("", "existing").getAbsolutePath()
? - Mehr Spaß, auf unix:
new File("")
gibt das aktuelle Verzeichnis zurück, währendnew File("","")
gibt das Dateisystem root... Riecht wie Schichten von legacy-API... - erscheint new File("", "vorhandenen").getAbsolutePath => "c:\existing" (und nicht, warum es wäre, dass der Weg für linux-und windows...ich bin mir nicht sicher)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den beiden argument-Konstruktor erwartet ein übergeordnetes Verzeichnis-Namen, also die zweite Zeile nach einer Datei, deren relative Pfad ist "/vorhandene". Auf einem linux-system, "/" ist die Wurzel (soweit ich weiß), also ist /vorhandene ist sehr unwahrscheinlich, zu existieren. Auf windows bin ich mir nicht sicher, was es interpretiert, als standardmäßig, aber wenn ich öffnen Sie eine Befehlszeile und sagen
cd /Desktop
(Arbeits-Verzeichnis meines user-Ordner), es sagt, dass es nicht finden können, den angegebenen Pfad.Dies ist, was passiert. Aber ich Stimme zu, weil das ist verwirrend
Ich habe keine Ahnung, warum dies der Fall ist, weil ich vermutet hatte es wäre auch pwd für die erste.
/
aber unter Windows gibt es kein root-Dateisystem, so muss es sein, system abhängig.File(".",...)
Karten immer auf das aktuelle Verzeichnis und nicht die Wurzel oder was auch immer.Ich erinnere mich an die Begegnung vor vielen Monden, also ich habe einige Graben in der eigentlichen Quelle. Hier ist der entsprechende source-Dokumentation von File.java:
So, das nicht-offensichtliche Verhalten erscheint aufgrund legacy-Gründen.
Vom java.io.Datei:
Es gibt keine Erwähnung von dem, was das Standard-Verzeichnis ist.
Bedenken, dass "die" ist NICHT dasselbe wie null. So
nicht davon ausgehen, die . - Verzeichnis. Wie @Dylan Halperin sagte, unter Linux mit "" weist auf das root /Verzeichnis, wie ich fand, mit diesem code:
Ausgabe:
Ja, ich hatte eine Datei erstellt mit der Bezeichnung "f1" in das Arbeitsverzeichnis.