Mesmo que a solução original para obter o diretório atual usando as empty Stringobras. Mas é recomendado usar a user.dirpropriedade para o diretório atual e user.homepara o diretório inicial.
Path currentPath = Paths.get(System.getProperty("user.dir"));
Path filePath = Paths.get(currentPath.toString(), "data", "foo.txt");
System.out.println(filePath.toString());
resultado:
/Users/user/coding/data/foo.txt
Da documentação da classe Java Path :
Um caminho é considerado um caminho vazio se consistir apenas em um elemento de nome, ou seja empty. Acessando um arquivo usando um empty path is equivalent to accessing the default directorydo sistema de arquivos.
Porque Paths.get("").toAbsolutePath()funciona
Quando uma string vazia é passada para o Paths.get(""), o Pathobjeto retornado contém o caminho vazio. Mas quando chamamos Path.toAbsolutePath(), ele verifica se o comprimento do caminho é maior que zero, caso contrário, ele usa a user.dirpropriedade 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 Pathinstância novamente depois de resolver o caminho do diretório atual.
Também gostaria de sugerir o uso File.separatorCharde código independente de plataforma.
Path currentRelativePath = Paths.get("");
Path currentDir = currentRelativePath.toAbsolutePath(); // <-- Get the Path and use resolve on it.
String filename = "data" + File.separatorChar + "foo.txt";
Path filepath = currentDir.resolve(filename);
// "data/foo.txt"
System.out.println(filepath);
Resultado:
/Users/user/coding/data/foo.txt
filepath.toString()