Como combinar caminhos em Java?

Existe um equivalente Java para System.IO.Path.Combine() em c # / .net? Ou algum código para conseguir isso?

Este método estático combina uma ou mais seqüências de caracteres em um caminho.

Em vez de manter tudo baseado em string, você deve usar uma class projetada para representar um caminho do sistema de arquivos.

Se você estiver usando o Java 7 ou o Java 8, considere usar java.nio.file.Path ; Path.resolve pode ser usado para combinar um caminho com outro ou com uma string. A class auxiliar Paths também é útil. Por exemplo:

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

Se você precisar atender a ambientes pré-Java-7, poderá usar java.io.File , desta forma:

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

Se você quiser voltar como uma string depois, você pode chamar getPath() . De fato, se você realmente quisesse imitar o Path.Combine , poderia escrever algo como:

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

No Java 7, você deve usar resolve :

 Path newPath = path.resolve(childPath); 

Embora a class NIO2 Path possa parecer um pouco redundante para o File com uma API desnecessariamente diferente, ela é, na verdade, sutilmente mais elegante e robusta.

Note que Paths.get() (como sugerido por outra pessoa) não tem uma sobrecarga tomando um Path , e fazer Paths.get(path.toString(), childPath) não é a mesma coisa que resolve() . resolve() é mais inteligente. Dos documentos do Paths.get() :

Observe que, embora esse método seja muito conveniente, usá-lo implicará uma referência presumida ao FileSystem padrão e limitará o utilitário do código de chamada. Por isso, não deve ser usado em código de biblioteca destinado a reutilização flexível. Uma alternativa mais flexível é usar uma instância de caminho existente como uma âncora, como:

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

A function irmã para resolve é a excelente relativize :

 Path childPath = path.relativize(newPath); 

A principal resposta é usar objects File. No entanto, o Commons IO tem uma class FilenameUtils que pode fazer esse tipo de coisa, como o método concat () .

Eu sei que é um longo tempo desde a resposta original de Jon, mas eu tinha um requisito semelhante ao OP.

Ao estender a solução de Jon, eu apresentei o seguinte, o que levará um ou mais segmentos de caminho, levando quantos segmentos de caminho você puder lançar nele.

Uso

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

Codifique aqui para outros com um problema semelhante

 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 melhorar a resposta do JodaStephen, o Apache Commons IO possui FilenameUtils, que faz isso. Exemplo (no Linux):

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

Ele é independente de plataforma e produzirá os separadores que seu sistema precisar.

abordagem independente de plataforma (usa File.separator, ou seja, funciona depende do sistema operacional onde o código está sendo executado:

 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 

Se você não precisa mais do que strings, você pode usar com.google.common.io.Files

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

para obter

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

Aqui está uma solução que lida com várias partes do caminho e condições de borda:

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