HOWTO · Java

Obtenha o diretório inicial do usuário em Java

Esta postagem mostra como obter o diretório inicial do usuário em Java.

Nesta página

Use System.getProperty("user.home") do Java para obter o valor do diretório pessoal como String. Converta esse valor em Path ou File quando uma API precisar de um objeto de sistema de arquivos. Variáveis de ambiente como HOME e USERPROFILE são alternativas somente quando sua aplicação precisa de uma variável específica e pode lidar com sua ausência ou configuração diferente.

Obtenha o diretório pessoal do usuário com System.getProperty("user.home")

user.home é a propriedade de sistema Java destinada a armazenar o diretório pessoal do usuário atual. System.getProperty() retorna o valor como uma string. O valor vem do ambiente Java em execução: ele pode ser configurado quando a JVM é iniciada e, por isso, pode ser diferente do local esperado com base no sistema operacional. Consultar essa propriedade não verifica se o caminho existe nem se o processo tem acesso a ele.

Execute este exemplo. O rótulo literal User home: exibido pelo código permanece em inglês.

public class Main {
  public static void main(String[] args) {
    String home = System.getProperty("user.home");
    System.out.println("User home: " + home);
  }
}

O caminho impresso depende da máquina e da configuração do processo Java; portanto, não há um único caminho de saída que sirva para todos os casos. O exemplo imprime o valor da propriedade, mas não cria nem inspeciona um diretório.

Use o diretório pessoal em operações com arquivos

As APIs de sistema de arquivos recebem objetos de caminho quando você precisa resolver caminhos filhos ou fornecer um local para operações com arquivos. Converta a string retornada usando Path.of(home) no Java 11 ou posterior, ou use Paths.get(home) se o projeto tiver como alvo uma versão anterior do Java que ofereça java.nio.file. A classe File também é uma opção para APIs que esperam um File.

Por exemplo, depois de obter home como acima, Path homePath = Paths.get(home); cria um Path para esse local. Resolva um caminho filho com Path settings = homePath.resolve(".config").resolve("myapp");. Isso combina os componentes do caminho de acordo com as regras do sistema de arquivos padrão, em vez de concatenar strings com uma barra. Você pode passar o Path resultante a APIs como Files.newBufferedReader() ou Files.createDirectories(), conforme necessário. Criar um Path, por si só, não altera nada no disco; escolha uma operação que execute a ação de arquivo necessária e trate os erros de E/S.

Se uma API existente precisar de File, crie-o com new File(home). Use o tipo aceito pela API em questão; Path é a escolha padrão para código mais recente de sistema de arquivos. Nenhuma das conversões verifica o local nem concede acesso.

Leia HOME ou USERPROFILE das variáveis de ambiente

System.getenv("HOME") e System.getenv("USERPROFILE") leem variáveis de ambiente pelo nome, e System.getenv() retorna uma String ou null quando a variável solicitada não está disponível para o processo. HOME é comumente usada em ambientes semelhantes ao Unix, e USERPROFILE em ambientes Windows, mas aplicações, contêineres, serviços e configurações de inicialização podem variar. Os nomes e valores dependem do ambiente; não presuma que verificar o nome do sistema operacional garante que a variável correspondente exista ou aponte para o diretório desejado.

Se você precisa especificamente de uma dessas variáveis, verifique se o resultado é null antes de convertê-lo em caminho ou usá-lo. Decida o que a aplicação deve fazer quando a variável estiver ausente, como recorrer a user.home ou informar um problema de configuração. Prefira a propriedade Java quando a tarefa for simplesmente obter o valor do diretório pessoal configurado para o Java. Não imprima todo o ambiente para encontrar uma variável: isso pode expor configurações irrelevantes e valores confidenciais.

Use Apache Commons IO quando já for uma dependência

Um projeto que já inclui Apache Commons IO pode usar FileUtils.getUserDirectory() para obter um File ou FileUtils.getUserDirectoryPath() para obter um caminho em string. Esses métodos convenientes não eliminam a necessidade de considerar o valor fornecido pelo ambiente Java e não justificam adicionar uma dependência para essa única consulta. Adicione a biblioteca somente quando o projeto já a utilizar ou precisar de seus outros utilitários de E/S.

Escolha um método e considere as limitações

Para operações comuns de sistema de arquivos em Java, leia user.home com System.getProperty() e converta o resultado em Path ou File, conforme o tipo exigido pela API usada. Escolha System.getenv() somente quando sua aplicação depender especificamente de uma variável de ambiente, e esteja preparado para ela estar ausente ou ter sido personalizada. Use Apache Commons IO quando já fizer parte do projeto e o tipo retornado for adequado ao seu código.

Trate o valor do diretório pessoal como um caminho inicial, não como prova de que o diretório existe, permite gravação ou é o local certo para os dados da aplicação. Verifique ou crie diretórios usando as APIs de sistema de arquivos necessárias para sua tarefa e trate as falhas de E/S documentadas. Assim, a consulta fica separada da operação no sistema de arquivos e as suposições da aplicação ficam explícitas.