395 votes

Combiner des chemins en Java

Existe-t-il un équivalent Java pour System.IO.Path.Combine() en C#/.NET ? Ou un code permettant de réaliser cela ?

Cette méthode statique combine une ou plusieurs chaînes de caractères en un chemin.

455voto

Jon Skeet Points 692016

Plutôt que de conserver tout ce qui est basé sur des chaînes de caractères, si vous utilisez la fonction java.io.File que vous pouvez faire :

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 sous forme de chaîne plus tard, vous pouvez appeler getPath() . En effet, si vous vouliez vraiment imiter Path.Combine, vous pourriez simplement écrire quelque chose comme :

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

151voto

Aleksandr Dubinsky Points 2488

En Java 7, vous devez le faire :

Path newPath = path.resolve(childPath);

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

Notez que Paths.get() (comme suggéré par quelqu'un d'autre) n'a pas de surcharge prenant un Path et de faire Paths.get(path.toString(), childPath) n'est PAS la même chose que resolve() . resolve() est plus intelligent. De la Paths.get() docs :

Notez que bien que cette méthode soit très pratique, son utilisation impliquera une référence présumée au système de fichiers par défaut et limitera l'utilité du code appelant. Par conséquent, elle ne devrait pas être utilisée dans le code de bibliothèque destiné à une réutilisation flexible. Une alternative plus flexible consiste à utiliser une instance Path existante comme ancrage, comme par exemple :

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

La fonction sœur de resolve est excellent :

Path childPath = path.relativize(newPath);

43voto

JodaStephen Points 6357

La principale réponse est d'utiliser des objets Fichier. Cependant, Commons IO a une classe FilenameUtils qui peuvent faire ce genre de choses.

17voto

isNaN1247 Points 7480

Je sais qu'il s'est écoulé beaucoup de temps depuis la réponse originale de Jon, mais j'avais une exigence similaire à celle de l'OP.

En étendant la solution de Jon, j'ai trouvé la solution suivante, qui prend un ou plusieurs segments de chemin et prend autant de segments de chemin que vous pouvez lui donner.

Utilisation

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

Code ici pour les autres ayant un problème similaire

public class Path {
    public static String combine(String... paths)
    {
        File file = new File(paths[0]);

        for (int i = 1; i < paths.length ; i++) {
            file = new File(file, paths[i]);
        }

        return file.getPath();
    }
}

11voto

alpian Points 3002

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

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X