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

136

Il semble y avoir trois façons identiques d'obtenir le "séparateur de fichiers" dépendant de la plate-forme indépendamment de la plate-forme:

Comment décidons-nous quand utiliser lequel?

Y a-t-il même une différence entre eux?

Pacerier
la source
N'obtenez-vous pas réellement le séparateur de fichiers dépendant de la plate-forme ici? Juste dans un manoir indépendant de la plate-forme.
steinybot
@Steiny, oui, mis à jour.
Pacerier
Une question Java typique a au moins 3 réponses ou plus
Stimpson Cat

Réponses:

142

System.getProperties()peut être remplacé par des appels à System.setProperty(String key, String value)ou avec des paramètres de ligne de commande-Dfile.separator=/

File.separator obtient le séparateur du système de fichiers par défaut.

FileSystems.getDefault() vous donne le système de fichiers par défaut.

FileSystem.getSeparator()vous donne le caractère de séparation du système de fichiers. Notez qu'en tant que méthode d'instance, vous pouvez l'utiliser pour transmettre différents systèmes de fichiers à votre code autre que celui par défaut, dans les cas où vous avez besoin de votre code pour fonctionner sur plusieurs systèmes de fichiers dans la même JVM.

Bringer128
la source
2
Cool = D Btw pourriez-vous élaborer sur la partie sur «l'exploitation de plusieurs systèmes de fichiers»?
Pacerier
4
@Pacerier En théorie, si j'écrivais un nouveau système de fichiers (BringerFS) qui avait un caractère séparateur de ":" et que vous aviez une machine avec 2 partitions, une en NTFS et une en BringerFS, cette fonctionnalité vous permettrait d'utiliser les deux (en supposant J'ai également écrit un fournisseur Java Filesystem).
Bringer128
Je veux dire pratiquement est-ce utile, comme disons que quelqu'un avait 2 partitions une Windows et une UNIX, et il exécute mon application (sur sa partition Windows), est-ce que la classe est capable d' accéder à son système de fichiers UNIX? (Je n'ai pas pu vraiment tester cela car je n'ai pas d'autre système de fichiers installé.)
Pacerier
1
Je soupçonne que la plupart des pilotes pour les systèmes de fichiers sous Windows effectuent la traduction en une API de système de fichiers de type `` Windows '' afin de permettre au système d'exploitation et aux applications non portables de fonctionner. L'utilisation pratique devrait concerner un système d'exploitation qui prend en charge des systèmes de fichiers étranges et merveilleux sans paradigme fixe comme Windows.
Bringer128
Oh, et pour répondre à votre autre question - vous auriez une FileSysteminstance différente pour chaque système de fichiers que vous avez traité.
Bringer128
31

Si votre code ne traverse pas les limites du système de fichiers, c'est-à-dire que vous ne travaillez qu'avec un seul système de fichiers, utilisez java.io.File.separator.

Cela vous donnera, comme expliqué, le séparateur par défaut pour votre FS. Comme Bringer128 l'a expliqué, System.getProperty("file.separator")peut être remplacé via les options de ligne de commande et n'est pas aussi sûr de type que java.io.File.separator.

Le dernier, a java.nio.file.FileSystems.getDefault().getSeparator();été introduit dans Java 7, vous pouvez donc l'ignorer pour l'instant si vous souhaitez que votre code soit portable dans les anciennes versions de Java.

Ainsi, chacune de ces options est presque la même que les autres, mais pas tout à fait. Choisissez celui qui correspond à vos besoins.

darioo
la source
Est java.ioobsolète en faveur de java.nio?
Pacerier
13
@Pacerier: non, il n'est pas obsolète. java.ioest un peu plus bas que java.nio, mais toujours très et largement utile. Vous pouvez voir les différences ici: blogs.oracle.com/slc/entry/javanio_vs_javaio . nione le remplace pas io, il l'étend de multiples façons (et s'utilise iosous le capot).
darioo