A dificuldade é que deve ser multiplataforma. Windows 2000, XP, Vista, OSX, Linux, outras variantes unix. Estou procurando um trecho de código que possa fazer isso em todas as plataformas e uma maneira de detectar a plataforma.
Agora, você deve estar ciente do bug 4787931 que user.home
não funciona corretamente; portanto, não me forneça respostas em livros didáticos, posso encontrá-las nos manuais.
java
cross-platform
home-directory
Bruno Ranschaert
fonte
fonte
Respostas:
O bug que você mencionou (bug 4787391) foi corrigido no Java 8. Mesmo se você estiver usando uma versão mais antiga do Java, a
System.getProperty("user.home")
abordagem provavelmente ainda é a melhor. Auser.home
abordagem parece funcionar em um número muito grande de casos. Uma solução 100% à prova de balas no Windows é difícil, porque o Windows tem um conceito inconstante do significado do diretório inicial.Se
user.home
não for bom o suficiente para você, sugiro escolher uma definição dehome directory
para Windows e usá-la, obtendo a variável de ambiente apropriadaSystem.getenv(String)
.fonte
Na verdade, com o Java 8, o caminho certo é usar:
O bug JDK-6519127 foi corrigido e a seção "Incompatibilidades entre JDK 8 e JDK 7" das notas de versão afirma:
Apesar da pergunta ser antiga, deixo isso para referência futura.
fonte
Veja o JavaDoc .
fonte
O conceito de um diretório HOME parece ser um pouco vago no que diz respeito ao Windows. Se as variáveis de ambiente (HOMEDRIVE / HOMEPATH / USERPROFILE) não forem suficientes, pode ser necessário recorrer ao uso de funções nativas via JNI ou JNA . SHGetFolderPath permite recuperar pastas especiais, como Meus Documentos (CSIDL_PERSONAL) ou Configurações Locais \ Dados de Aplicativos (CSIDL_LOCAL_APPDATA).
Código JNA de amostra:
fonte
Outros responderam a pergunta antes de mim, mas um programa útil para imprimir todas as propriedades disponíveis é:
fonte
Enquanto procurava a versão Scala, tudo o que pude encontrar foi o código JNA de McDowell acima. Incluo minha porta Scala aqui, pois atualmente não há lugar mais apropriado.
Assim como na versão Java, você precisará adicionar o Java Native Access , incluindo os dois arquivos jar, às suas bibliotecas referenciadas.
É bom ver que o JNA agora torna isso muito mais fácil do que quando o código original foi publicado.
fonte
Eu usaria o algoritmo detalhado no relatório de erros usando System.getenv (String) e utilizaria a propriedade user.dir se nenhuma das variáveis de ambiente indicasse um diretório existente válido. Isso deve funcionar em várias plataformas.
Acho que, no Windows, o que você realmente procura é o diretório "documentos" nocional do usuário.
fonte
Alternativa seria usar o Apache CommonsIO em
FileUtils.getUserDirectory()
vez deSystem.getProperty("user.home")
. Você obterá o mesmo resultado e não há chance de introduzir um erro de digitação ao especificar a propriedade do sistema.Há uma grande chance de você já ter a biblioteca Apache CommonsIO em seu projeto. Não o introduza se planeja usá-lo apenas para obter o diretório inicial do usuário.
fonte
Se você deseja algo que funcione bem no Windows, existe um pacote chamado WinFoldersJava que encerra a chamada nativa para obter os diretórios 'especiais' no Windows. Nós o usamos com freqüência e funciona bem.
fonte