Quelle est la différence entre l'utilisation File.separator
et une normale /
dans une chaîne de chemin Java?
Contrairement à l' \\
indépendance de la plate-forme à double barre oblique inverse ne semble pas être la raison, car les deux versions fonctionnent sous Windows et Unix.
public class SlashTest {
@Test
public void slash() throws Exception {
File file = new File("src/trials/SlashTest.java");
assertThat(file.exists(), is(true));
}
@Test
public void separator() throws Exception {
File file = new File("src" + File.separator + "trials" + File.separator + "SlashTest.java");
assertThat(file.exists(), is(true));
}
}
Pour reformuler la question, si cela /
fonctionne sous Unix et Windows, pourquoi devrait-on jamais vouloir l'utiliser File.separator
?
Réponses:
Avec les bibliothèques Java pour traiter les fichiers, vous pouvez utiliser en toute sécurité
/
(barre oblique, pas barre oblique inverse) sur toutes les plates-formes. Le code de bibliothèque gère la traduction des choses en chemins spécifiques à la plate-forme en interne.Vous voudrez peut-être utiliser
File.separator
dans l'interface utilisateur, car il est préférable de montrer aux gens ce qui aura du sens dans leur système d'exploitation, plutôt que ce qui est logique pour Java.Mise à jour : Je n'ai pas pu, en cinq minutes de recherche, trouver le comportement "vous pouvez toujours utiliser une barre oblique" documenté. Maintenant, je suis sûr que je l'ai vu documenté, mais en l'absence de trouver une référence officielle (parce que ma mémoire n'est pas parfaite), je m'en tiendrai à l'utilisation
File.separator
parce que vous savez que cela fonctionnera.la source
File
utiliseFileSystem.normalize
partout pour «normaliser» les chemins reçus via l'API publique, et presque tout ce qui concerne les chaînes de chemin de fichier (par exemple,FileWriter(String)
) utiliseFile
sous les couvertures.File
.Vous utilisez
File.separator
parce qu'un jour votre programme pourrait fonctionner sur une plate-forme développée dans un pays lointain, un pays de choses étranges et de personnes étrangères, où les chevaux pleurent et les vaches exploitent tous les ascenseurs. Dans ce pays, les gens ont traditionnellement utilisé le caractère ":" comme séparateur de fichiers, et la JVM obéit donc consciencieusement à leurs souhaits.la source
Bien que l'utilisation de File.separator pour référencer un nom de fichier soit exagérée (pour ceux qui imaginent des contrées lointaines, j'imagine que leur implémentation JVM remplacerait un
/
par un:
comme les fenêtres jvm le remplace par un\
).Cependant, parfois vous obtenez la référence du fichier, vous ne la créez pas, et vous devez l'analyser, et pour pouvoir le faire, vous devez connaître le séparateur sur la plate-forme. File.separator vous aide à le faire.
la source
OK, inspectons du code.
File.java
lignes 428 à 435 enFile.<init>
:Et lisons les
fs/*(FileSystem)*/.fromURIPath()
documents:Cela signifie
FileSystem.fromURIPath()
que le post-traitement sur le chemin URI est uniquement sous Windows, et parce que dans la ligne suivante:Il remplace chaque «/» par un système dépendant
seperatorChar
, vous pouvez toujours être sûr que «/» est sûr dans tous les systèmes d'exploitation.la source
Eh bien, il y a plus de systèmes d'exploitation que Unix et Windows (appareils portables, etc.), et Java est connu pour sa portabilité. La meilleure pratique consiste à l'utiliser, afin que la machine virtuelle Java puisse déterminer laquelle est la meilleure pour ce système d'exploitation.
la source
:
séparateurs de style Mac ont depuis longtemps disparu. Il semble que tout le monde sauf Windows utilise la norme/
. Et même les fenêtres semblent bien gérer les barres obliques maintenant. Essayezcd /windows/system
un système Windows 10 à partir de votre lecteur système principal. Bien que vous souhaitiez toujours afficher les chemins à l'aide du séparateur système (afin de ne pas confondre vos utilisateurs), vous pouvez simplement utiliser la barre oblique/
partout ailleurs et être sûr que votre code fonctionnera partout où vous êtes susceptible de le déployer.Bien que cela ne fasse pas beaucoup de différence sur le chemin du retour, il le fait sur le chemin du retour.
Bien sûr, vous pouvez utiliser '/' ou '\' dans le nouveau fichier (chemin de chaîne), mais File.getPath () ne vous en donnera qu'un seul.
la source
/
vers l' avant ou vers l'arrière\\
. Mais partout ailleurs, vous feriez mieux d'utiliser la barre oblique/
ou vous aurez des problèmes.Tard à la fête. Je suis sur Windows 10 avec JDK 1.8 et Eclipse MARS 1.
Je trouve que
getClass().getClassLoader().getResourceAsStream("path/to/resource");
fonctionne et
getClass().getClassLoader().getResourceAsStream("path"+File.separator+"to"+File.separator+"resource");
ne fonctionne pas et
getClass().getClassLoader().getResourceAsStream("path\to\resource");
ne marche pas. Les deux derniers sont équivalents. Donc ... j'ai de bonnes raisons de NE PAS utiliser File.separator.
la source
getClass().getClassLoader().getResourceAsStream("path\to\resource");
, il y a une tabulation (\t
) et un retour chariot (\r
).File.separator
c'est une barre oblique inverse. Ce n'est que dans les chaînes codées en dur où il est traité comme un caractère d'échappement où vous devez échapper à la barre oblique inverse. Si vous avez stocké le caractère dans un fichier texte, ou dans unchar
ouString
alors vous n'avez pas besoin de l'échapper une deuxième fois car il a déjà été converti en barre oblique inverse attendue. Essayez ceci pour voir par vous-même:String backslash = "\\"; System.out.println("welcome" + backslash + "to" + backslash + "reality");
portabilité claire et simple.
la source
/
ou le séparateur systèmeFile.separator
. Ces deux éléments semblent fonctionner partout. Bien qu'ilFile.separator
soit garanti de fonctionner partout, la simple barre oblique/
semble également fonctionner partout. Si cela ne fonctionne pas quelque part, j'aimerais en entendre parler. Je crois que cela fonctionnera sur tous les systèmes. À tout le moins, je n'ai pas encore trouvé d'endroit qui/
ne fonctionne pas (Mac OSX, Windows, * nix, Android, iOS - je n'ai pas vérifié les Mac OSX antérieurs qui utilisaient ":" comme séparateur, OS / 2, NeXT, ou l'un des autres OS vraiment anciens)."Java SE8 for Programmers" prétend que Java va faire face à l'un ou l'autre. (p. 480, dernier paragraphe). L'exemple affirme que:
analysera très bien. Prenez note du dernier séparateur (de style Unix).
C'est collant et probablement sujet aux erreurs, mais c'est ce qu'ils prétendent (Deitel et Deitel).
Je pense que la confusion pour les gens, plutôt que pour Java, est une raison suffisante pour ne pas utiliser cette fonctionnalité (mis?).
la source
Comme les messieurs ont décrit la différence avec les détails des variantes.
Je voudrais recommander l'utilisation de la classe Apache Commons io api,
FilenameUtils
lorsque vous traitez des fichiers dans un programme avec la possibilité de déployer sur plusieurs OS.la source
Le chemin d'accès d'un fichier ou d'un répertoire est spécifié à l'aide des conventions de dénomination du système hôte. Cependant, la classe File définit des constantes dépendantes de la plateforme qui peuvent être utilisées pour gérer les noms de fichiers et de répertoires d'une manière indépendante de la plateforme.
Files.seperator définit le caractère ou la chaîne qui sépare le répertoire et les composants du fichier dans un nom de chemin. Ce séparateur est '/', '\' ou ':' pour Unix, Windows et Macintosh, respectivement.
la source
Si vous utilisez Java 7, extrayez Path.resolve () et Paths.get () .
la source
L'utilisation de File.separator a permis à Ubuntu de générer des fichiers avec "\" sur son nom au lieu de répertoires. Peut-être que je suis paresseux avec la façon dont je crée des fichiers (et répertoires) et que j'aurais pu l'éviter, malgré tout, utilisez "/" à chaque fois pour éviter les fichiers avec "\" sur son nom
la source
Si vous essayez de créer un fichier à partir d'un chemin prêt (enregistré dans la base de données, par exemple) à l'aide du séparateur Linux, que dois-je faire?
Peut-être utilisez-vous simplement le chemin pour créer le fichier:
Mais Windows utilise un séparateur différent (
\
). Alors, l'alternative est-elle de convertir le séparateur de barres obliques en plateforme indépendante? Comme:Cette méthode
convertPathToPlatformIndependent
aura probablement une sorte de séparation par "/" et se joindra à File.separator.Eh bien, pour moi, ce n'est pas bien pour un langage indépendant de la plate-forme (non?) Et Java prend déjà en charge l'utilisation de
/
Windows ou Linux. Mais si vous travaillez avec des chemins et devez vous souvenir de cette conversion à chaque fois, ce sera un cauchemar et vous n'aurez aucun gain réel pour l'application sur le futur (peut-être dans l'univers décrit par @Pointy).la source