2011-11-10 10 views
99

Sembra esserci tre identiche modi per ottenere il "separatore di file" dipendente dalla piattaforma piattaforma-indipendente:File.separator vs FileSystem.getSeparator() vs System.getProperty ("file.separator")?

Come decidiamo quando usare quale?

C'è qualche differenza tra loro?

+0

Non stai ottenendo qui il separatore di file dipendente dalla piattaforma? Solo in un maniero indipendente dalla piattaforma. – Steiny

+0

@Steiny, Sì, aggiornato. – Pacerier

risposta

107

System.getProperties() possono essere sovrascritti da chiamate verso System.setProperty(String key, String value) o con la linea di comando Parametri -Dfile.separator=/

File.separator ottiene il separatore per il file system predefinito.

FileSystems.getDefault() ottiene il file system predefinito.

FileSystem.getSeparator() ottiene il carattere separatore per il filesystem. Si noti che come metodo di istanza si può usare questo per passare diversi filesystem al proprio codice diverso da quello predefinito, nei casi in cui è necessario il proprio codice per operare su più filesystem in quella JVM.

+2

Cool = D Btw potresti approfondire la parte su "funzionamento di più filesystem"? – Pacerier

+2

@Pacerier In teoria, se avessi scritto un nuovo filesystem (BringerFS) che aveva un carattere separatore di ":" e avevi una macchina con 2 partizioni, una in NTFS e una in BringerFS, questa funzionalità ti permetterebbe di usare entrambe (supponendo che abbia anche scritto un provider di file system Java). – Bringer128

+0

Voglio dire praticamente è utile, come dire che qualcuno aveva 2 partizioni un Windows e un UNIX, e sta facendo funzionare la mia app (sulla sua partizione Windows), è che la classe è in grado di * accedere * al suo file system UNIX? (Non ho potuto testare questo perché non ho un altro FileSystem installato.) – Pacerier

22

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

Questo sarà, come spiegato, ottenere il separatore predefinito per il vostro FS. Come spiegato da Bringer128, System.getProperty("file.separator") può essere annullato tramite le opzioni della riga di comando e non è sicuro come il tipo java.io.File.separator.

L'ultimo, java.nio.file.FileSystems.getDefault().getSeparator(); è stato introdotto in Java 7, quindi per ora potrebbe anche essere ignorato se si desidera che il codice sia trasferibile su versioni Java precedenti.

Quindi, ognuna di queste opzioni è quasi la stessa di altre, ma non del tutto. Scegli uno che si adatta alle tue esigenze.

+0

'java.io' è deprecato a favore di' java.nio'? – Pacerier

+8

@Pacerier: no, non è deprecato. 'java.io' è un po 'più basso di' java.nio', ma comunque molto e ampiamente utile. Puoi vedere le differenze qui: https://blogs.oracle.com/slc/entry/javanio_vs_javaio. 'nio' non sostituisce' io', lo estende in molti modi (e usa 'io' sotto il cofano). – darioo

+0

Grazie che è un buon link =) – Pacerier

Problemi correlati