Comment combiner des chemins en Java?

Existe-t-il un équivalent Java pour System.IO.Path.Combine() dans C # /. NET? Ou n’importe quel code pour accomplir cela?

Cette méthode statique combine une ou plusieurs chaînes dans un chemin.

Plutôt que de tout garder sous forme de chaîne, vous devez utiliser une classe conçue pour représenter un chemin de système de fichiers.

Si vous utilisez Java 7 ou Java 8, vous devriez envisager java.nio.file.Path utiliser java.nio.file.Path ; Path.resolve peut être utilisé pour combiner un chemin avec un autre ou avec une chaîne. La classe d’assistance Paths est également utile. Par exemple:

 Path path = Paths.get("foo", "bar", "baz.txt"); 

Si vous avez besoin de prendre en charge des environnements pré-Java-7, vous pouvez utiliser java.io.File , comme ceci:

 File baseDirectory = new File("foo"); File subDirectory = new File(baseDirectory, "bar"); File fileInDirectory = new File(subDirectory, "baz.txt"); 

Si vous voulez le récupérer en tant que chaîne plus tard, vous pouvez appeler getPath() . En effet, si vous voulez vraiment imiter Path.Combine , vous pouvez simplement écrire quelque chose comme:

 public static Ssortingng combine(Ssortingng path1, Ssortingng path2) { File file1 = new File(path1); File file2 = new File(file1, path2); return file2.getPath(); } 

Dans Java 7, vous devez utiliser la resolve :

 Path newPath = path.resolve(childPath); 

Bien que la classe NIO2 Path puisse sembler un peu redondante pour File avec une API inutilement différente, elle est en fait subtilement plus élégante et robuste.

Notez que Paths.get() (comme suggéré par quelqu’un d’autre) n’a pas de surcharge en prenant un Path , et que Paths.get(path.toSsortingng(), childPath) n’est pas la même chose que resolve() . resolve() est plus intelligent. A partir des documents Paths.get() :

Notez que même si cette méthode est très pratique, son utilisation impliquera une référence supposée au système de fichiers par défaut et limitera l’utilité du code appelant. Par conséquent, il ne doit pas être utilisé dans un code de bibliothèque destiné à une réutilisation flexible. Une alternative plus flexible consiste à utiliser une instance Path existante en tant qu’ancre, telle que:

 Path dir = ... Path path = dir.resolve("file"); 

La fonction soeur à resolve est l’excellent relativize :

 Path childPath = path.relativize(newPath); 

La principale réponse consiste à utiliser des objects File. Cependant Commons IO a une classe FilenameUtils qui peut faire ce genre de chose, comme la méthode concat () .

Je sais qu’il y a longtemps depuis la réponse originale de Jon, mais j’avais une exigence similaire à celle du PO.

En étendant la solution de Jon, je suis arrivé avec les éléments suivants, qui prendront un ou plusieurs segments de chemin en prenant autant de segments que vous pouvez y lancer.

Usage

 Path.combine("/Users/beardtwizzle/"); Path.combine("/", "Users", "beardtwizzle"); Path.combine(new Ssortingng[] { "/", "Users", "beardtwizzle", "arrayUsage" }); 

Code ici pour les autres avec un problème similaire

 public class Path { public static Ssortingng combine(Ssortingng... paths) { File file = new File(paths[0]); for (int i = 1; i < paths.length ; i++) { file = new File(file, paths[i]); } return file.getPath(); } } 

Pour améliorer la réponse de JodaStephen, Apache Commons IO a FilenameUtils qui le fait. Exemple (sous Linux):

 assert org.apache.commons.io.FilenameUtils.concat("/home/bob", "work\\stuff.log") == "/home/bob/work/stuff.log" 

Elle est indépendante de la plate-forme et produira tous les séparateurs dont votre système a besoin.

approche indépendante de la plate-forme (utilise File.separator, c.-à-d. que le fonctionnement dépend du système d’exploitation sur lequel le code est exécuté:

 java.nio.file.Paths.get(".", "path", "to", "file.txt") // relative unix path: ./path/to/file.txt // relative windows path: .\path\to\filee.txt java.nio.file.Paths.get("/", "path", "to", "file.txt") // absolute unix path: /path/to/filee.txt // windows network drive path: \\path\to\file.txt java.nio.file.Paths.get("C:", "path", "to", "file.txt") // absolute windows path: C:\path\to\file.txt 

Si vous n’avez pas besoin de plus de chaînes, vous pouvez utiliser com.google.common.io.Files

 Files.simplifyPath("some/prefix/with//extra///slashes" + "file//name") 

obtenir

 "some/prefix/with/extra/slashes/file/name" 

Voici une solution qui gère plusieurs parties de chemin et conditions de bord:

 public static Ssortingng combinePaths(Ssortingng ... paths) { if ( paths.length == 0) { return ""; } File combined = new File(paths[0]); int i = 1; while ( i < paths.length) { combined = new File(combined, paths[i]); ++i; } return combined.getPath(); }