Em Python
posso unir dois caminhos com os.path.join
:
os.path.join("foo", "bar") # => "foo/bar"
Estou tentando conseguir o mesmo em Java, sem me preocupar se o OS
é Unix
, Solaris
ou Windows
:
public static void main(String[] args) {
Path currentRelativePath = Paths.get("");
String current_dir = currentRelativePath.toAbsolutePath().toString();
String filename = "data/foo.txt";
Path filepath = currentRelativePath.resolve(filename);
// "data/foo.txt"
System.out.println(filepath);
}
Eu esperava que isso Path.resolve( )
se juntaria ao meu diretório atual /home/user/test
com o data/foo.txt
making /home/user/test/data/foo.txt
. O que estou entendendo de errado?
filepath.toString()
new File(parent, child)
Respostas:
Mesmo que a solução original para obter o diretório atual usando as
empty String
obras. Mas é recomendado usar auser.dir
propriedade para o diretório atual euser.home
para o diretório inicial.resultado:
Da documentação da classe Java Path :
Porque
Paths.get("").toAbsolutePath()
funcionaQuando uma string vazia é passada para o
Paths.get("")
, oPath
objeto retornado contém o caminho vazio. Mas quando chamamosPath.toAbsolutePath()
, ele verifica se o comprimento do caminho é maior que zero, caso contrário, ele usa auser.dir
propriedade do sistema e retorna o caminho atual.Aqui está o código para a implementação do sistema de arquivos Unix: UnixPath.toAbsolutePath ()
Basicamente, você precisa criar a
Path
instância novamente depois de resolver o caminho do diretório atual.Também gostaria de sugerir o uso
File.separatorChar
de código independente de plataforma.Resultado:
fonte
separatorChar
seja inferior a alguma "abstração de nível superior", algo que se parece comPathBuilder(currentRelativePath).append("data").append("foo.txt")
Paths#get(String first, String... more)
estados,Para obter o diretório do usuário atual, você pode simplesmente usar
System.getProperty("user.dir")
.Além disso, o
get
método usa o argumento de comprimento variável deString
, que será usado para fornecer strings de caminho subsequentes. Então, para criarPath
para/test/inside/abc.txt
você tem que usá-lo da seguinte maneira,fonte
Não é um método específico.
Se você usa java 8 ou melhor, tem 2 opções:
a) Use java.util.StringJoiner
b) Use
String.join(File.pathSeparator, "path1", "path2");
Se você usa java 7 ou inferior, pode usar a biblioteca commons-lang do apache commons. A classe StringUtils tem um método para unir strings usando um separador.
c)
StringUtils.join(new Object[] {"path1", "path2"}, File.pathSeparator);
Uma nota: você pode usar linux pathseparator "/" para windows (lembre-se de que caminhos absolutos são algo como "/ C: / mydir1 / mydir2". Usar sempre "/" é muito útil se você usar protocolos como file: //
fonte
/home/user/test:foo.txt
File.separator
trabalhou para mim em vez deFile.pathSeparator
A maneira mais básica é:
Você nunca deve escrever
Paths.get("")
. Estou surpreso que funcione. Se você quiser se referir ao diretório atual explicitamente, usePaths.get(System.getProperty("user.dir"))
. Se quiser o diretório inicial do usuário, usePaths.get(System.getProperty("user.home"))
.Você também pode combinar as abordagens:
fonte
A maneira mais confiável e independente de plataforma de unir caminhos em Java é usando
Path::resolve
(conforme observado no JavaDoc paraPaths::get
). Para uma matriz de comprimento arbitrário de Strings representando partes de um caminho, eles podem ser unidos usando um Java Stream:fonte
Você pode fazer como
Um bom post detalhado está aqui. Path Sample Usecase
fonte