File.separator vs FileSystem.getSeparator () vs System.getProperty ("file.separator")?

136

Es scheint drei identische Möglichkeiten zu geben, um das plattformabhängige "Dateitrennzeichen" plattformunabhängig zu erhalten:

Wie entscheiden wir, wann wir welche verwenden?

Gibt es überhaupt einen Unterschied zwischen ihnen?

Pacerier
quelle
Erhalten Sie hier nicht tatsächlich das plattformabhängige Dateitrennzeichen? Nur in einem plattformunabhängigen Herrenhaus.
Steinybot
@Steiny, Ja, aktualisiert.
Pacerier
Eine typische Java-Frage hat mindestens 3 oder mehr Antworten
Stimpson Cat

Antworten:

142

System.getProperties()kann durch Aufrufe von System.setProperty(String key, String value)oder mit Befehlszeilenparametern überschrieben werden-Dfile.separator=/

File.separator Ruft das Trennzeichen für das Standarddateisystem ab.

FileSystems.getDefault() Erhält das Standard-Dateisystem.

FileSystem.getSeparator()Ruft das Trennzeichen für das Dateisystem ab. Beachten Sie, dass Sie dies als Instanzmethode verwenden können, um andere Dateisysteme als die Standardmethode an Ihren Code zu übergeben, wenn Sie Ihren Code benötigen, um auf mehreren Dateisystemen in einer JVM zu arbeiten.

Bringer128
quelle
2
Cool = D Übrigens, könnten Sie den Teil "Betrieb mehrerer Dateisysteme" näher erläutern?
Pacerier
4
@Pacerier Wenn ich theoretisch ein neues Dateisystem (BringerFS) mit dem Trennzeichen ":" schreiben würde und Sie einen Computer mit zwei Partitionen hätten, eine in NTFS und eine in BringerFS, könnten Sie mit dieser Funktionalität beide verwenden (vorausgesetzt Ich habe auch einen Java-Dateisystemanbieter geschrieben.
Bringer128
Ich meine, praktisch ist es nützlich, wenn jemand zwei Partitionen hat, eine Windows- und eine UNIX-Partition, und er meine App ausführt (auf seiner Windows-Partition). Kann die Klasse auf sein UNIX-Dateisystem zugreifen ? (Ich konnte dies nicht wirklich testen, da ich kein anderes Dateisystem installiert habe.)
Pacerier
1
Ich vermute, dass die meisten Treiber für Dateisysteme unter Windows die Übersetzung in eine Dateisystem-API im Windows-Stil durchführen, damit das Betriebssystem und nicht tragbare Apps funktionieren. Die praktische Anwendung müsste für ein Betriebssystem erfolgen, das seltsame und wunderbare Dateisysteme ohne ein festes Paradigma wie Windows unterstützt.
Bringer128
Oh, und um Ihre andere Frage zu beantworten: Sie hätten FileSystemfür jedes Dateisystem, mit dem Sie sich befasst haben, eine andere Instanz.
Bringer128
31

Wenn Ihr Code keine Dateisystemgrenzen überschreitet, dh Sie arbeiten nur mit einem Dateisystem, verwenden Sie java.io.File.separator.

Dadurch erhalten Sie, wie erläutert, das Standardtrennzeichen für Ihren FS. Wie Bringer128 erklärt, System.getProperty("file.separator")kann über Befehlszeilenoptionen überschrieben werden und ist nicht so typsicher wie java.io.File.separator.

Die letzte java.nio.file.FileSystems.getDefault().getSeparator();Version wurde in Java 7 eingeführt. Sie können sie daher vorerst ignorieren, wenn Sie möchten, dass Ihr Code auf ältere Java-Versionen portierbar ist.

Jede dieser Optionen ist fast dieselbe wie die anderen, aber nicht ganz. Wählen Sie eine, die Ihren Anforderungen entspricht.

Darioo
quelle
Ist java.iozugunsten von veraltet java.nio?
Pacerier
13
@ Pacerier: Nein, es ist nicht veraltet. java.ioist ein bisschen niedriger als java.nio, aber immer noch sehr und weithin nützlich. Sie können die Unterschiede hier sehen: blogs.oracle.com/slc/entry/javanio_vs_javaio . nioersetzt nicht io, es erweitert es auf mehrere Arten (und verwendet iounter der Haube).
Darioo