Quelle est la meilleure façon de trouver le répertoire de base d'utilisateurs en Java?
La difficulté est qu'il doit être multi-plateforme. Windows 2000, XP, Vista, OSX, Linux, d'autres variantes d'unix. Je suis à la recherche d'un morceau de code qui peut accomplir ce pour toutes les plateformes, et un moyen pour détecter la plate-forme.
Maintenant, vous devez être conscient de bug 4787931 que user.home
ne fonctionne pas correctement, veuillez donc ne pas me donner de manuel réponses, je peux trouver moi-même dans les manuels.
- Avez-vous essayé les solutions de contournement mentionnées dans le bug? Il ya beaucoup de suggestions.
- bug 4787931 pour les versions de java via 1.4.2 montre de nouveau que le bug 6519127 pour la version 1.6 de java. Le problème ne va pas disparaître et est toujours répertorié comme une faible priorité.
- Note: bug 4787391 est marqué comme résolu dans Java 8
Vous devez vous connecter pour publier un commentaire.
Le bug que vous avez de référence (bug 4787391) a été corrigé dans Java 8. Même si vous utilisez une ancienne version de Java, la
System.getProperty("user.home")
approche est probablement encore le meilleur. Leuser.home
approche semble fonctionner dans un très grand nombre de cas. Un 100% à l'épreuve des balles solution sur Windows est dur, parce que Windows a un changement de concept de ce qu'est le home directory de moyens.Si
user.home
n'est pas assez bon pour vous, je voudrais vous suggérons de choisir une définition dehome directory
pour windows et en utilisant correctement la variable d'environnement avecSystem.getenv(String)
.Fait avec Java 8 de la bonne façon est d'utiliser:
Le bug JDK-6519127 a été corrigé et les "Incompatibilités entre JDK JDK 8 et 7" de la notes de version états:
En dépit de la question de la vieillesse, je laisse cette référence pour l'avenir.
Voir le JavaDoc.
La notion de répertoire d'ACCUEIL semble être un peu vague quand il s'agit de Windows. Si le les variables d'environnement (HOMEDRIVE/HOMEPATH/USERPROFILE) ne sont pas assez, vous pouvez avoir à recourir à l'aide de fonctions natives via JNI ou JNA. SHGetFolderPath vous permet de récupérer des dossiers spéciaux, comme Mes Documents (CSIDL_PERSONAL) ou Local Settings\Application Data (CSIDL_LOCAL_APPDATA).
Échantillon JNA code:
D'autres ont répondu à la question avant moi, mais un programme utile pour imprimer toutes les propriétés disponibles est:
Que je cherchais Scala version, tout ce que je pouvais trouver était McDowell JNA code ci-dessus. - Je inclure mon Scala port ici, comme il n'y a actuellement n'est pas le plus approprié.
Comme avec la version de Java, vous aurez besoin d'ajouter Java Accès Natif, y compris les deux fichiers jar, pour votre référencé bibliothèques.
C'est agréable de voir que la JNA maintenant cela rend beaucoup plus facile que quand le code original a été publié.
Je voudrais utiliser l'algorithme détaillé dans le rapport de bogue en utilisant le Système.la fonction getenv(String), et retourne à l'aide de l'utilisateur.dir propriété si aucune des variables d'environnement indiqué valide d'un répertoire existant. Cela devrait fonctionner de la croix-plate-forme.
Je pense que, sous Windows, ce que vous êtes vraiment après est la notion de "documents" répertoire.
Si vous voulez quelque chose qui fonctionne bien sur windows il y a un paquet appelé WinFoldersJava qui encapsule l'appel des indigènes pour obtenir le "spécial" répertoires de Windows. Nous l'utilisons fréquemment et il fonctionne bien.
Alternative serait d'utiliser Apache CommonsIO
FileUtils.getUserDirectory()
au lieu deSystem.getProperty("user.home")
. Il vous permet d'obtenir le même résultat et il n'y a aucune chance pour introduire une faute de frappe lors de la spécification du système de la propriété.Il ya une grande chance que vous avez déjà Apache CommonsIO bibliothèque dans votre projet. Ne pas le présenter si vous prévoyez de l'utiliser seulement pour arriver répertoire principal de l'utilisateur.