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


136

Sembra che ci siano tre modi identici per ottenere il "separatore di file" dipendente dalla piattaforma in modo indipendente:

Come decidiamo quando usare quale?

C'è qualche differenza tra loro?


Non stai effettivamente ottenendo il separatore di file dipendente dalla piattaforma qui? Solo in un maniero indipendente dalla piattaforma.
steinybot,

@Steiny, Yea, aggiornato.
Pacerier,

Una tipica domanda Java ha almeno 3 o più risposte
Stimpson Cat,

Risposte:


142

System.getProperties()può essere sovrascritto dalle chiamate verso System.setProperty(String key, String value)o con i parametri della riga di comando-Dfile.separator=/

File.separator ottiene il separatore per il filesystem predefinito.

FileSystems.getDefault() ti fornisce il filesystem predefinito.

FileSystem.getSeparator()ti dà il carattere separatore per il filesystem. Si noti che come metodo di istanza è possibile utilizzare questo per passare diversi file system al codice diverso da quello predefinito, nei casi in cui è necessario che il codice funzioni su più file system in una JVM.


2
Cool = D Btw potresti approfondire la parte sul "funzionamento di più filesystem"?
Pacerier,

4
@Pacerier In teoria, se avessi scritto un nuovo filesystem (BringerFS) con un carattere separatore di ":" e avessi una macchina con 2 partizioni, una in NTFS e una in BringerFS, questa funzionalità ti permetterebbe di usare entrambi (supponendo Ho anche scritto un provider di filesystem Java).
Bringer128,

Intendo praticamente è utile, come dire che qualcuno aveva 2 partizioni una Windows e una UNIX, e sta eseguendo la mia app (sulla sua partizione Windows), è la classe in grado di accedere al suo file system UNIX? (Non potrei davvero provarlo perché non ho un altro FileSystem installato.)
Pacerier

1
Ho il sospetto che la maggior parte dei driver per filesystem su Windows esegua la traduzione in un'API di filesystem "Windows-style" in modo che permetta al sistema operativo e alle app non portatili di funzionare. L'uso pratico dovrebbe essere per un sistema operativo che supporti file system strani e meravigliosi senza un paradigma fisso come Windows.
Bringer128,

Oh, e per rispondere alla tua altra domanda - avresti FileSystemun'istanza diversa per ogni file system che hai trattato.
Bringer128,

31

Se il tuo codice non attraversa i confini del filesystem, cioè stai solo lavorando con un filesystem, allora usa java.io.File.separator.

Questo, come spiegato, ti darà il separatore predefinito per il tuo FS. Come spiegato da Bringer128, System.getProperty("file.separator")può essere sostituito tramite le opzioni della riga di comando e non è sicuro come il tipojava.io.File.separator .

L'ultimo, è java.nio.file.FileSystems.getDefault().getSeparator();stato introdotto in Java 7, quindi potresti anche ignorarlo per ora se vuoi che il tuo codice sia portatile su versioni Java precedenti.

Quindi, ognuna di queste opzioni è quasi uguale alle altre, ma non del tutto. Scegli quello più adatto alle tue esigenze.


È java.iodeprecato a favore di java.nio?
Pacerier,

13
@Pacerier: no, non è deprecato. java.ioè un po 'più basso di java.nio, ma comunque molto e ampiamente utile. Puoi vedere le differenze qui: blogs.oracle.com/slc/entry/javanio_vs_javaio . nionon sostituisce io, lo estende in più modi (e utilizza iosotto il cofano).
darioo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.