Die Schwierigkeit besteht darin, dass es plattformübergreifend sein sollte. Windows 2000, XP, Vista, OSX, Linux, andere Unix-Varianten. Ich suche nach einem Codeausschnitt, der dies für alle Plattformen erreichen kann, und nach einer Möglichkeit, die Plattform zu erkennen.
Jetzt sollten Sie sich des Fehlers 4787931 bewusst sein , user.home
der nicht richtig funktioniert. Geben Sie mir daher bitte keine Antworten aus dem Lehrbuch. Diese finden Sie selbst in den Handbüchern.
java
cross-platform
home-directory
Bruno Ranschaert
quelle
quelle
Antworten:
Der Fehler, auf den Sie verweisen (Fehler 4787391), wurde in Java 8 behoben. Selbst wenn Sie eine ältere Version von Java verwenden, ist der
System.getProperty("user.home")
Ansatz wahrscheinlich immer noch der beste. Deruser.home
Ansatz scheint in sehr vielen Fällen zu funktionieren. Eine 100% kugelsichere Lösung unter Windows ist schwierig, da Windows ein sich änderndes Konzept der Bedeutung des Home-Verzeichnisses hat.Wenn
user.home
es Ihnen nicht gut genug ist, würde ich vorschlagen, eine Definition vonhome directory
für Windows auszuwählen und diese zu verwenden und die entsprechende Umgebungsvariable mit zu erhaltenSystem.getenv(String)
.quelle
Mit Java 8 ist der richtige Weg:
Der Fehler JDK-6519127 wurde behoben und die „Inkompatibilität zwischen JDK 8 und JDK 7“ Abschnitt der Release Notes heißt es :
Obwohl die Frage alt ist, lasse ich dies zum späteren Nachschlagen.
quelle
Siehe JavaDoc .
quelle
Das Konzept eines HOME-Verzeichnisses scheint in Bezug auf Windows etwas vage zu sein. Wenn die Umgebungsvariablen (HOMEDRIVE / HOMEPATH / USERPROFILE) nicht ausreichen, müssen Sie möglicherweise auf native Funktionen über JNI oder JNA zurückgreifen . SHGetFolderPath können Sie spezielle Ordner abzurufen, wie My Documents (CSIDL_PERSONAL) oder Lokale Einstellungen \ Anwendungsdaten (CSIDL_LOCAL_APPDATA).
Beispiel-JNA-Code:
quelle
Andere haben die Frage vor mir beantwortet, aber ein nützliches Programm zum Ausdrucken aller verfügbaren Eigenschaften ist:
quelle
Als ich nach der Scala-Version suchte, konnte ich oben nur McDowells JNA-Code finden. Ich füge hier meinen Scala-Port hinzu, da es derzeit keinen angemesseneren gibt.
Wie bei der Java-Version müssen Sie Ihren referenzierten Bibliotheken Java Native Access , einschließlich beider JAR-Dateien, hinzufügen .
Es ist schön zu sehen, dass JNA dies jetzt viel einfacher macht als zu dem Zeitpunkt, als der ursprüngliche Code veröffentlicht wurde.
quelle
Ich würde den im Fehlerbericht beschriebenen Algorithmus mit System.getenv (String) verwenden und auf die Verwendung der Eigenschaft user.dir zurückgreifen, wenn keine der Umgebungsvariablen ein gültiges vorhandenes Verzeichnis angibt. Dies sollte plattformübergreifend funktionieren.
Ich denke, unter Windows ist das fiktive "Dokumente" -Verzeichnis des Benutzers das, wonach Sie wirklich suchen.
quelle
Alternativ wäre die Verwendung von Apache CommonsIO
FileUtils.getUserDirectory()
anstelle vonSystem.getProperty("user.home")
. Sie erhalten das gleiche Ergebnis und es besteht keine Möglichkeit, einen Tippfehler einzuführen, wenn Sie die Systemeigenschaft angeben.Es besteht eine große Chance, dass Sie bereits eine Apache CommonsIO-Bibliothek in Ihrem Projekt haben. Führen Sie es nicht ein, wenn Sie es nur zum Abrufen des Benutzer-Home-Verzeichnisses verwenden möchten.
quelle
Wenn Sie etwas möchten, das unter Windows gut funktioniert, gibt es ein Paket namens WinFoldersJava, das den nativen Aufruf umschließt , um die "speziellen" Verzeichnisse unter Windows abzurufen . Wir benutzen es häufig und es funktioniert gut.
quelle