Was ist der Unterschied zwischen der Verwendung File.separator
und einer normalen/
in einem Java Path-String?
Im Gegensatz zur doppelten Backslash- \\
Plattform scheint die Unabhängigkeit nicht der Grund zu sein, da beide Versionen unter Windows und Unix funktionieren.
public class SlashTest {
@Test
public void slash() throws Exception {
File file = new File("src/trials/SlashTest.java");
assertThat(file.exists(), is(true));
}
@Test
public void separator() throws Exception {
File file = new File("src" + File.separator + "trials" + File.separator + "SlashTest.java");
assertThat(file.exists(), is(true));
}
}
Um die Frage neu zu formulieren: Wenn es /
unter Unix und Windows funktioniert, warum sollte man es jemals verwenden wollen File.separator
?
Antworten:
Mit den Java-Bibliotheken für den Umgang mit Dateien können Sie sicher
/
(Schrägstrich, nicht Backslash) auf allen Plattformen verwenden. Der Bibliothekscode behandelt die interne Übersetzung von Dingen in plattformspezifische Pfade.Möglicherweise möchten Sie es jedoch
File.separator
in der Benutzeroberfläche verwenden, da es am besten ist, den Benutzern zu zeigen, was in ihrem Betriebssystem sinnvoll ist und nicht, was für Java sinnvoll ist.Update : Ich konnte in fünf Minuten der Suche das dokumentierte Verhalten "Sie können immer einen Schrägstrich verwenden" nicht finden. Ich bin mir sicher, dass ich es dokumentiert gesehen habe, aber da ich keine offizielle Referenz gefunden habe (weil mein Gedächtnis nicht perfekt ist), würde ich bei der Verwendung bleiben,
File.separator
weil Sie wissen, dass das funktionieren wird.quelle
File
verwendet derFileSystem.normalize
ganzen Ort zu „normalisieren“ Wege über die öffentliche API empfangen, und fast alles , was die sich mit Dateipfad Strings (zum BeispielFileWriter(String)
) AnwendungenFile
unter der Decke.File
.Sie verwenden,
File.separator
weil Ihr Programm eines Tages möglicherweise auf einer Plattform ausgeführt wird, die in einem fernen Land entwickelt wurde, einem Land mit seltsamen Dingen und fremden Menschen, in dem Pferde weinen und Kühe alle Aufzüge bedienen. In diesem Land haben die Menschen traditionell das Zeichen ":" als Dateitrennzeichen verwendet, und so gehorcht die JVM pflichtbewusst ihren Wünschen.quelle
Obwohl File.separator mit einem Dateinamen referenzieren Overkill ist (für diejenigen , die fernen Ländern vorstellen, stelle ich mir ihre JVM Implementierung eine ersetzen würde
/
mit:
genau wie die Fenster Jvm ersetzt mit einer es\
).Manchmal erhalten Sie jedoch die Dateireferenz, erstellen sie nicht und müssen sie analysieren. Um dies tun zu können, müssen Sie das Trennzeichen auf der Plattform kennen. File.separator hilft Ihnen dabei.
quelle
OK, lassen Sie uns einen Code untersuchen.
File.java
Zeilen 428 bis 435 inFile.<init>
:Und lesen wir die
fs/*(FileSystem)*/.fromURIPath()
Dokumente:Dies bedeutet, dass
FileSystem.fromURIPath()
die Nachbearbeitung im URI-Pfad nur unter Windows erfolgt und in der nächsten Zeile:Es ersetzt jedes '/' durch systemabhängig
seperatorChar
. Sie können immer sicher sein, dass '/' in jedem Betriebssystem sicher ist .quelle
Nun, es gibt mehr Betriebssysteme als Unix und Windows (tragbare Geräte usw.), und Java ist für seine Portabilität bekannt. Die beste Vorgehensweise besteht darin, es zu verwenden, damit die JVM ermitteln kann, welches für dieses Betriebssystem am besten geeignet ist.
quelle
:
Trennzeichen im Mac-Stil sind längst verschwunden. Es scheint, dass alle außer Windows den Standard/
nicht mehr verwenden. Und selbst Fenster scheinen jetzt gut mit Schrägstrichen umzugehen. Probieren Siecd /windows/system
ein Windows 10-System von Ihrem Hauptsystemlaufwerk aus. Während Sie weiterhin Pfade mithilfe des Systemtrennzeichens anzeigen möchten (um Ihre Benutzer nicht zu verwirren), können Sie/
überall nur Schrägstriche verwenden und sicher sein, dass Ihr Code überall dort funktioniert, wo Sie ihn wahrscheinlich bereitstellen.Auf dem Rückweg macht es zwar keinen großen Unterschied, aber auf dem Rückweg.
Natürlich können Sie entweder '/' oder '\' in einer neuen Datei (String-Pfad) verwenden, aber File.getPath () gibt Ihnen nur eine davon.
quelle
/
oder\\
Schrägstriche verwenden. Aber woanders verwenden Sie besser Schrägstriche, sonst treten/
Probleme auf.Spät zur Party. Ich bin auf Windows 10 mit JDK 1.8 und Eclipse MARS 1.
Ich finde das
getClass().getClassLoader().getResourceAsStream("path/to/resource");
funktioniert und
getClass().getClassLoader().getResourceAsStream("path"+File.separator+"to"+File.separator+"resource");
funktioniert nicht und
getClass().getClassLoader().getResourceAsStream("path\to\resource");
funktioniert nicht. Die letzten beiden sind gleichwertig. Also ... ich habe guten Grund, File.separator NICHT zu verwenden.
quelle
getClass().getClassLoader().getResourceAsStream("path\to\resource");
gibt es eine Tabelle (\t
) und einen Wagenrücklauf (\r
).File.separator
es einen Backslash gibt. Nur in fest codierten Zeichenfolgen wird es als Escape-Zeichen behandelt, bei dem Sie dem Backslash entkommen müssen. Wenn Sie das Zeichen in einer Textdatei oder in einemchar
oder gespeichert haben,String
müssen Sie es nicht ein zweites Mal maskieren, da es bereits in das erwartete Backslash-Zeichen konvertiert wurde. Versuchen Sie dies, um sich selbst davon zu überzeugen:String backslash = "\\"; System.out.println("welcome" + backslash + "to" + backslash + "reality");
Portabilität schlicht und einfach.
quelle
/
oder das SystemtrennzeichenFile.separator
. Beide scheinen überall zu funktionieren. WährendFile.separator
garantiert überall funktioniert,/
scheint der einfache Schrägstrich auch überall zu funktionieren. Wenn es irgendwo nicht funktioniert, würde ich gerne davon hören. Ich glaube, dass es auf allen Systemen funktionieren wird. Zumindest habe ich noch keinen Ort gefunden,/
der nicht funktioniert (Mac OSX, Windows, * nix, Android, iOS - ich habe vor OSX Macs, die ":" als Trennzeichen verwendet haben, OS / nicht überprüft, OS / 2, NeXT oder eines der anderen wirklich alten Betriebssysteme)."Java SE8 für Programmierer" behauptet, dass Java mit beiden fertig wird. (S. 480, letzter Absatz). Das Beispiel behauptet, dass:
wird gut analysieren. Beachten Sie das letzte (Unix-artige) Trennzeichen.
Es ist klebrig und wahrscheinlich fehleranfällig, aber es ist das, was sie (Deitel und Deitel) behaupten.
Ich denke, die Verwirrung für die Menschen und nicht für Java ist Grund genug, diese (falsche?) Funktion nicht zu verwenden.
quelle
Wie die Herren den Unterschied mit Variantendetails beschrieben haben.
Ich möchte die Verwendung der Apache Commons io api-Klasse empfehlen ,
FilenameUtils
wenn Dateien in einem Programm mit der Möglichkeit der Bereitstellung auf mehreren Betriebssystemen verarbeitet werden.quelle
Der Pfadname für eine Datei oder ein Verzeichnis wird anhand der Namenskonventionen des Hostsystems angegeben. Die File-Klasse definiert jedoch plattformabhängige Konstanten, mit denen Datei- und Verzeichnisnamen plattformunabhängig behandelt werden können.
Files.seperator definiert das Zeichen oder die Zeichenfolge, die das Verzeichnis und die Dateikomponenten in einem Pfadnamen trennt. Dieses Trennzeichen lautet '/', '\' oder ':' für Unix, Windows und Macintosh.
quelle
Wenn Sie Java 7 verwenden, überprüfen Sie Path.resolve () und Paths.get () .
quelle
Mit File.separator hat Ubuntu Dateien mit dem Namen "\" anstelle von Verzeichnissen generiert. Vielleicht bin ich faul, wie ich Dateien (und Verzeichnisse) erstelle, und hätte es vermeiden können, unabhängig davon, jedes Mal "/" zu verwenden, um Dateien mit "\" im Namen zu vermeiden
quelle
Was kann ich tun, wenn Sie versuchen, eine Datei aus einem fertigen Pfad (z. B. in einer Datenbank gespeichert) mit dem Linux-Trennzeichen zu erstellen?
Vielleicht verwenden Sie einfach den Pfad, um die Datei zu erstellen:
Windows verwendet jedoch ein anderes Trennzeichen (
\
). Ist die Alternative, den Schrägstrich-Separator in eine plattformunabhängige umzuwandeln? Mögen:Diese Methode
convertPathToPlatformIndependent
wahrscheinlich durch "/" geteilt und mit File.separator verbunden.Für mich ist das nicht gut für eine Sprache, die plattformunabhängig ist (oder?) Und Java unterstützt bereits die Verwendung
/
unter Windows oder Linux. Wenn Sie jedoch mit Pfaden arbeiten und sich jedes Mal an diese Konvertierung erinnern müssen, ist dies ein Albtraum und Sie werden in Zukunft keinen wirklichen Gewinn für die Anwendung haben (möglicherweise in dem von @Pointy beschriebenen Universum).quelle