¿Cómo combinar rutas en Java?

¿Hay un equivalente Java para System.IO.Path.Combine() en C # /. NET? O cualquier código para lograr esto?

Este método estático combina una o más cadenas en una ruta.

En lugar de mantener todo basado en cadenas, debe usar una clase que esté diseñada para representar una ruta del sistema de archivos.

Si está utilizando Java 7 o Java 8, debe considerar usar java.nio.file.Path ; Path.resolve se puede usar para combinar una ruta con otra o con una cadena. La clase de ayuda Paths es útil. Por ejemplo:

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

Si necesita atender entornos previos a Java-7, puede usar java.io.File , así:

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

Si lo quiere volver como una cadena más tarde, puede llamar a getPath() . De hecho, si realmente quieres imitar a Path.Combine , puedes escribir algo como:

 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, debe usar resolve :

 Path newPath = path.resolve(childPath); 

Si bien la clase NIO2 Path puede parecer un poco redundante para File con una API innecesariamente diferente, de hecho es sutilmente más elegante y robusta.

Tenga en cuenta que Paths.get() (como lo sugirió alguien más) no tiene una sobrecarga tomando una Path Paths.get(path.toString(), childPath) , y hacer Paths.get(path.toString(), childPath) NO es lo mismo que resolve() . resolve() es más inteligente. De los documentos Paths.get() :

Tenga en cuenta que si bien este método es muy conveniente, su uso implicará una referencia asumida al sistema de archivos predeterminado y limitará la utilidad del código de llamada. Por lo tanto, no debe utilizarse en el código de la biblioteca destinado a la reutilización flexible. Una alternativa más flexible es usar una instancia de Path existente como ancla, como por ejemplo:

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

La función hermana de resolve es la excelente relativize :

 Path childPath = path.relativize(newPath); 

La respuesta principal es usar objetos de archivo. Sin embargo, Commons IO tiene una clase FilenameUtils que puede hacer este tipo de cosas, como el método concat () .

Sé que pasó mucho tiempo desde la respuesta original de Jon, pero tenía un requisito similar al del OP.

Al extender la solución de Jon, se me ocurrió lo siguiente, que tomará uno o más segmentos de ruta requiere tantos segmentos de ruta que se le puedan lanzar.

Uso

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

Codifique aquí para otros con un problema similar

 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(); } } 

Para mejorar la respuesta de JodaStephen, Apache Commons IO tiene FilenameUtils que hace esto. Ejemplo (en Linux):

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

Es independiente de la plataforma y producirá los separadores que su sistema necesite.

Enfoque independiente de la plataforma (utiliza File.separator, es decir, funciona dependiendo del sistema de operación donde se ejecuta el código:

 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 no necesita más cadenas, puede usar com.google.common.io.Files

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

Llegar

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

Aquí hay una solución que maneja múltiples partes de ruta y condiciones de borde:

 public static String combinePaths(String ... 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(); }