File.separator o File.pathSeparator


519

Nella Fileclasse ci sono due stringhe separatore pathSeparator.

Qual è la differenza? Quando dovrei usarne uno sopra l'altro?


6
La denominazione è un po 'confusa, la velocità con cui è necessaria una cosa del genere è semplicemente terribile (cfr. Perl). Guarda gli esempi per pathSeparatorChar e separatorChar . Oppure usa la semplice mnemonica: pathSeparator separa i percorsi.
maaartinus,

6
Dedicare un minuto alla stampa di entrambi sullo schermo avrebbe risposto alla tua domanda ...
Jean-François Corbett,

13
Anche se generalmente sono d'accordo, semplicemente stamparli sul suo sistema non mostrerà le varianti per altri sistemi operativi.
b1nary.atr0phy

Risposte:


680

Se vuoi dire File.separatore File.pathSeparatorpoi:

  • File.pathSeparatorviene utilizzato per separare i singoli percorsi di file in un elenco di percorsi di file. Considerare su Windows, la variabile d'ambiente PATH. Si utilizza un ;per separare i percorsi dei file così su Windows File.pathSeparatorsarebbe ;.

  • File.separatorè /o \utilizzato per suddividere il percorso in un file specifico. Ad esempio su Windows è \oC:\Documents\Test


6
Sembra che File.separatordovrebbe essere File.fileSeparatorriguardo aFile.pathSeparator
Eddy

1
@Eddy Vedo il tuo punto, ma potrebbe essere ridondante poiché il nome della classe è File. Penso che la parte del file sia implicita. Ma chissà perché hanno fatto molto di quello che hanno fatto con Java.
user489041

117

Si utilizza il separatore quando si crea un percorso di file. Quindi in unix il separatore è /. Quindi, se volessi costruire il percorso unix, /var/templo faresti in questo modo:

String path = File.separator + "var"+ File.separator + "temp"

Si utilizza pathSeparatorquando si ha a che fare con un elenco di file come in un percorso di classe. Ad esempio, se la tua app ha preso un elenco di barattoli come argomento, il modo standard per formattare tale elenco su unix è:/path/to/jar1.jar:/path/to/jar2.jar:/path/to/jar3.jar

Quindi dato un elenco di file faresti qualcosa del genere:

String listOfFiles = ...
String[] filePaths = listOfFiles.split(File.pathSeparator);

5
Se stai costruendo un percorso * nix come /var/tempallora è inutile da usare File.separatorpoiché hai già un codice dipendente dalla piattaforma. Potrebbe anche hardcode il percorso.
Isapir,

109

java.io.FileLa classe contiene quattro variabili di separazione statica. Per una migliore comprensione, capiamo con l'aiuto di un po 'di codice

  1. separator: carattere di separazione dei nomi predefinito dipendente dalla piattaforma come String. Per Windows, è '\' e per unix è '/'
  2. separatorChar: uguale al separatore ma è char
  3. pathSeparator: variabile dipendente dalla piattaforma per il separatore di percorso. Ad esempio, PATH o CLASSPATH elenco di variabili di percorsi separati da ':' nei sistemi Unix e ';' nel sistema di Windows
  4. pathSeparatorChar: uguale a pathSeparator ma è char

Si noti che tutte queste sono variabili finali e dipendenti dal sistema.

Ecco il programma java per stampare queste variabili di separazione. FileSeparator.java

import java.io.File;

public class FileSeparator {

    public static void main(String[] args) {
        System.out.println("File.separator = "+File.separator);
        System.out.println("File.separatorChar = "+File.separatorChar);
        System.out.println("File.pathSeparator = "+File.pathSeparator);
        System.out.println("File.pathSeparatorChar = "+File.pathSeparatorChar);
    }

}

Output del programma precedente sul sistema Unix:

File.separator = /
File.separatorChar = /
File.pathSeparator = :
File.pathSeparatorChar = :

Output del programma su sistema Windows:

File.separator = \
File.separatorChar = \
File.pathSeparator = ;
File.pathSeparatorChar = ;

Per rendere indipendente la nostra piattaforma di programma, dovremmo sempre usare questi separatori per creare il percorso del file o leggere qualsiasi variabile di sistema come PATH, CLASSPATH.

Ecco lo snippet di codice che mostra come utilizzare correttamente i separatori.

//no platform independence, good for Unix systems
File fileUnsafe = new File("tmp/abc.txt");
//platform independent and safe to use across Unix and Windows
File fileSafe = new File("tmp"+File.separator+"abc.txt");

1
Si noti che in Java il carattere barra rovesciata è in realtà \\, poiché una singola barra rovesciata è il carattere di escape per altre combinazioni di caratteri speciali, quindi la barra stessa viene utilizzata per sfuggire a se stessa. Il Stringechar restituito dai metodi sopra menzionati restituisce la barra rovesciata correttamente formattata (se su Windows).
Erik,

nuovo file ("tmp / abc.txt"); questo è corretto per Windows e Linux, ma non è corretto per unix nuovo File ("tmp \\ abc.txt"); questo è solo problema unix
DEV-Jacol
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.