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.
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.
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();
}
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);
La principale réponse est d'utiliser des objets Fichier. Cependant, Commons IO a une classe FilenameUtils qui peuvent faire ce genre de choses.
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();
}
}
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 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.