File.separator ou File.pathSeparator

519

Dans la Fileclasse, il y a deux chaînes separatoret pathSeparator.

Quelle est la différence? Quand devrais-je utiliser l'un sur l'autre?

icnhzabot
la source
6
La dénomination est un peu déroutante, le rapide que quelque chose comme ça est nécessaire est tout simplement terrible (cf. Perl). Regardez les exemples de pathSeparatorChar et separatorChar . Ou utilisez les mnémoniques simples: le pathSeparator sépare les chemins.
maaartinus
6
Prendre une minute pour les imprimer tous les deux à l'écran aurait répondu à votre question ...
Jean-François Corbett
13
Bien que je sois généralement d'accord, simplement les imprimer sur son système ne va pas montrer les variantes pour d'autres systèmes d'exploitation.
b1nary.atr0phy

Réponses:

680

Si vous voulez dire File.separatoret File.pathSeparatorensuite:

  • File.pathSeparatorest utilisé pour séparer les chemins de fichiers individuels dans une liste de chemins de fichiers. Considérez sous Windows, la variable d'environnement PATH. Vous utilisez un ;pour séparer les chemins d'accès aux fichiers de sorte que Windows le File.pathSeparatorserait ;.

  • File.separatorest soit /ou \qui est utilisé pour diviser le chemin vers un fichier spécifique. Par exemple sous Windows c'est \ouC:\Documents\Test

user489041
la source
6
On dirait que File.separatordevrait être File.fileSeparatorrelatif àFile.pathSeparator
Eddy
1
@Eddy Je vois votre point, mais il pourrait être redondant puisque le nom de la classe est File. Je pense que la partie du fichier est implicite. Mais qui sait pourquoi ils ont fait beaucoup de ce qu'ils ont fait avec Java.
user489041
117

Vous utilisez le séparateur lorsque vous créez un chemin de fichier. Donc, sous Unix, le séparateur est /. Donc, si vous vouliez construire le chemin Unix, /var/tempvous le feriez comme ceci:

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

Vous utilisez le pathSeparatorlorsque vous traitez une liste de fichiers comme dans un chemin de classe. Par exemple, si votre application a pris une liste de pots comme argument, la façon standard de formater cette liste sous Unix est:/path/to/jar1.jar:/path/to/jar2.jar:/path/to/jar3.jar

Donc, étant donné une liste de fichiers, vous feriez quelque chose comme ceci:

String listOfFiles = ...
String[] filePaths = listOfFiles.split(File.pathSeparator);
Karthik Ramachandran
la source
5
Si vous construisez un chemin * nix comme /var/tempcelui-ci, il est inutile de l'utiliser File.separatorcar vous avez déjà du code dépendant de la plate-forme. Pourrait aussi bien coder en dur le chemin.
isapir
109

java.io.FileLa classe contient quatre variables de séparateur statique. Pour une meilleure compréhension, comprenons à l'aide d'un code

  1. séparateur: caractère séparateur de nom par défaut dépendant de la plate-forme en tant que chaîne. Pour Windows, c'est '\' et pour Unix c'est '/'
  2. separatorChar: Identique au séparateur mais c'est char
  3. pathSeparator: variable dépendante de la plate-forme pour le séparateur de chemins. Par exemple, PATH ou CLASSPATH liste de variables de chemins séparés par ':' dans les systèmes Unix et ';' dans le système Windows
  4. pathSeparatorChar: Identique à pathSeparator mais c'est char

Notez que toutes ces variables sont finales et dépendent du système.

Voici le programme java pour imprimer ces variables de séparation. 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);
    }

}

Sortie du programme ci-dessus sur le système Unix:

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

Sortie du programme sur le système Windows:

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

Pour rendre notre plate-forme de programme indépendante, nous devons toujours utiliser ces séparateurs pour créer un chemin de fichier ou lire des variables système comme PATH, CLASSPATH.

Voici l'extrait de code montrant comment utiliser correctement les séparateurs.

//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");
foxt7ot
la source
1
Notez qu'en Java, la barre oblique inverse est en réalité \\, car une seule barre oblique inverse est le caractère d'échappement pour d'autres raccourcis de caractères spéciaux, de sorte que la barre oblique inverse elle-même est utilisée pour s'échapper. Les Stringet charretournés par les méthodes mentionnées ci-dessus renvoient la barre oblique inversée correctement formatée (si sous Windows).
Erik
nouveau fichier ("tmp / abc.txt"); c'est correct pour windows et linux mais ce n'est pas correct pour un nouveau fichier unix ("tmp \\ abc.txt"); c'est un problème uniquement unix
DEV-Jacol