Y at-il un utilitaire Java qui convertit un chemin de chaîne à utiliser le bon séparateur de fichier ombles?

StackOverflow https://stackoverflow.com/questions/1697303

Question

J'ai développé un certain nombre de classes qui manipulent des fichiers en Java. Je travaille sur un système Linux, et ont été béatement en tapant new File("path/to/some/file");. Quand il est venu le temps de commettre, j'ai réalisé quelques-uns des autres développeurs du projet sont sous Windows. Je voudrais maintenant appeler une méthode qui peut prendre dans une chaîne de la forme "/path/to/some/file" et, en fonction du système d'exploitation, retourner un chemin séparé correctement.

Par exemple:
"path/to/some/file" devient "path\\to\\some\\file" sous Windows.
Sur Linux, il retourne simplement la chaîne donnée.

Je me rends compte qu'il ne tardera pas à frapper une expression régulière qui pourrait le faire, mais je ne cherche pas à réinventer la roue, et préférerait une solution correctement testé. Ce serait bien si elle a été construite pour le JDK, mais si elle fait partie d'une certaine petite bibliothèque F / OSS qui est très bien aussi.

Ainsi est-il un utilitaire Java qui convertit un chemin de chaîne à utiliser le bon séparateur de fichier ombles?

Était-ce utile?

La solution

Apache Commons vient à la rescousse (encore une fois). La méthode Commons IO FilenameUtils.separatorsToSystem(String path) fera ce que vous voulez.

Inutile de dire que Apache Commons IO fera beaucoup plus en plus et vaut la peine de regarder.

Autres conseils

A "/path/to/some/file" en fait fonctionne sous Windows Vista et XP.

new java.io.File("/path/to/some/file").getAbsoluteFile()

> C:\path\to\some\file

Mais il est encore pas portable que Windows a plusieurs racines . Ainsi, le répertoire racine doit être sélectionnée d'une certaine façon. Il devrait y avoir aucun problème avec les chemins relatifs.

Edit:

Apache commons io ne pas Aide envs autre qu'Unix et fenêtres. Apache io code source :

public static String separatorsToSystem(String path) { 
    if (path == null) {
     return null;
    }
    if (isSystemWindows()) {
      return separatorsToWindows(path);
    } else {
      return separatorsToUnix(path);
    }
}

est ce que fait commons-io Apache, en deux déroula de lignes de code:

String separatorsToSystem(String res) {
    if (res==null) return null;
    if (File.separatorChar=='\\') {
        // From Windows to Linux/Mac
        return res.replace('/', File.separatorChar);
    } else {
        // From Linux/Mac to Windows
        return res.replace('\\', File.separatorChar);
    }
}

Donc, si vous voulez éviter la dépendance supplémentaire, il suffit d'utiliser cela.

Avec le nouveau Java 7, ils ont inclus une classe appelée chemins ce qui vous permet de faire exactement ce que vous voulez (voir http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html )

Voici un exemple:

String rootStorePath = Paths.get("c:/projects/mystuff/").toString();

Avez-vous la possibilité d'utiliser

System.getProperty("file.separator")

pour construire la chaîne qui représente le chemin?

Pour tous ceux qui essaient de faire ce 7 ans plus tard, la méthode de la Chambre des communes apache a été déplacé à la classe FilenameUtils:

FilenameUtils.separatorsToSystem(String path)

Je pense qu'il ya ce trou dans Java chemins.

Chaîne rootStorePath = Paths.get ( "c: / projets / mystuff /"). ToString ();

fonctionne si vous exécutez sur un système qui a le système de fichiers, vous devez utiliser. Comme l'a souligné, il a utilisé le système actuel de fichiers OS.

Je dois travailler avec des chemins entre Windows et Linux, dire copier un fichier d'un à l'autre. Tout en utilisant « / » tous les travaux que je suppose que si vous utilisez toutes les commandes Java, mais je dois faire un appel sftp donc en utilisant / ou File.separator etc ... ne me aide pas. Je ne peux pas utiliser le chemin () car il est à moi convertit au système de fichiers par défaut, je suis en cours d'exécution sur « maintenant ».

Que faut-Java est:
`Sur le système Windows: Chemin posixPath = Paths.get ( "/ home / mystuff", FileSystem.Posix); séjour / home / mystuff / et ne soit pas converti en \ home \ mystuff

sur le système Linux: Chaîne WinPath = Paths.get ( "c: \ home \ mystuff", FileSystem.Windows) .toString (); ` séjours c: \ home \ mystuff et ne soit pas converti en / c: / home / mystuff

similaire à travailler avec les jeux de caractères:

URLEncoder.encode ( "tout ici", "UTF-8") .getBytes ();

P.S. Je ne veux pas aussi charger un tout fichier jar io apache à faire quelque chose de simple non plus. Dans ce cas, ils ne sont pas ce que je propose de toute façon.

String fileName = Paths.get(fileName).toString();

fonctionne parfaitement avec Windows au moins, même avec des chemins mixtes, par exemple

c: \ users \ nom d'utilisateur / myproject \ myfiles / myfolder

devient

c:\users\username\myproject\myfiles\myfolder

Désolé vérifier ont pas ce que Linux ferait de ce qui précède, mais là encore la structure de fichiers Linux est différent vous donc pas la recherche d'un tel répertoire

devrait-il pas suffisant de dire:

"path"+File.Seperator+"to"+File.Seperator+"some"+File.Seperator+"file"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top