HOWTO · Java

Abrufen des Benutzer-Homeverzeichnisses in Java

Dieser Beitrag zeigt Ihnen, wie Sie das Home-Verzeichnis des Benutzers in Java erhalten.

Auf dieser Seite

Mit Java rufen Sie den Wert des Home-Verzeichnisses über System.getProperty("user.home") als String ab. Wenn eine API ein Dateisystemobjekt benötigt, können Sie diesen Wert in einen Path oder eine File umwandeln. Umgebungsvariablen wie HOME und USERPROFILE sind nur dann Alternativen, wenn Ihre Anwendung eine bestimmte Variable benötigt und damit umgehen kann, dass diese fehlt oder anders konfiguriert ist.

Das Home-Verzeichnis mit System.getProperty("user.home") abrufen

user.home ist die Java-Systemeigenschaft, die für das Home-Verzeichnis des aktuellen Benutzers vorgesehen ist. System.getProperty() gibt ihren Wert als Zeichenkette zurück. Der Wert stammt aus der laufenden Java-Umgebung: Er kann beim Start der JVM konfiguriert werden und sich daher von dem Verzeichnis unterscheiden, das Sie aufgrund des Betriebssystems erwarten. Beim Abrufen wird weder geprüft, ob der Pfad existiert, noch ob der Prozess darauf zugreifen kann.

Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

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

Der ausgegebene Pfad hängt vom Rechner und der Konfiguration des Java-Prozesses ab. Daher gibt es keinen Ausgabepfad, der überall gilt. Das Beispiel gibt den Wert der Eigenschaft aus; es erstellt oder untersucht kein Verzeichnis.

Das Home-Verzeichnis für Dateioperationen verwenden

Dateisystem-APIs verwenden Pfadobjekte, wenn Sie Unterpfade auflösen oder einen Speicherort an Dateioperationen übergeben möchten. Wandeln Sie die zurückgegebene Zeichenkette mit Path.of(home) um, wenn Sie Java 11 oder neuer verwenden. Für Projekte mit einer älteren Java-Version, die java.nio.file bereitstellt, können Sie stattdessen Paths.get(home) verwenden. Für APIs, die eine File erwarten, ist die Klasse File eine weitere Möglichkeit.

Nachdem Sie home wie oben abgerufen haben, erstellt zum Beispiel Path homePath = Paths.get(home); einen Path für diesen Speicherort. Einen Unterpfad erhalten Sie mit Path settings = homePath.resolve(".config").resolve("myapp");. So werden die Pfadbestandteile nach den Regeln des Standarddateisystems zusammengefügt, statt Zeichenketten mit einem Schrägstrich zu verketten. Den resultierenden Path können Sie bei Bedarf an APIs wie Files.newBufferedReader() oder Files.createDirectories() übergeben. Ein Path allein erstellt nichts auf dem Datenträger. Wählen Sie eine Operation, die die gewünschte Dateiaktion ausführt, und behandeln Sie deren E/A-Fehler.

Wenn eine vorhandene API eine File benötigt, erstellen Sie sie mit new File(home). Verwenden Sie den Typ, den die jeweilige API erwartet; bei neuerem Dateisystemcode ist Path die übliche Wahl. Keine der beiden Umwandlungen prüft, ob der Speicherort vorhanden ist oder Zugriff darauf besteht.

HOME oder USERPROFILE aus Umgebungsvariablen lesen

System.getenv("HOME") und System.getenv("USERPROFILE") lesen benannte Umgebungsvariablen. System.getenv() gibt eine String oder null zurück, wenn die angeforderte Variable für den Prozess nicht verfügbar ist. HOME wird häufig in Unix-ähnlichen Umgebungen und USERPROFILE häufig in Windows-Umgebungen verwendet. Anwendungen, Container, Dienste und Startkonfigurationen können sich jedoch unterscheiden. Namen und Werte hängen von der jeweiligen Umgebung ab. Gehen Sie deshalb nicht davon aus, dass die Prüfung des Betriebssystems garantiert, dass die entsprechende Variable existiert oder auf das gewünschte Verzeichnis verweist.

Wenn Sie eine dieser Variablen ausdrücklich benötigen, prüfen Sie vor der Umwandlung in einen Pfad oder der weiteren Verwendung, ob sie null ist. Legen Sie fest, was Ihre Anwendung bei einer fehlenden Variable tun soll, etwa auf user.home zurückzugreifen oder einen Konfigurationsfehler zu melden. Wenn Sie lediglich den von Java konfigurierten Wert des Home-Verzeichnisses benötigen, verwenden Sie vorzugsweise die Java-Eigenschaft. Geben Sie nicht die gesamte Umgebung aus, um eine einzelne Variable zu finden: Dabei können unnötige Konfigurationsdaten und vertrauliche Werte offengelegt werden.

Apache Commons IO verwenden, wenn es bereits eine Abhängigkeit ist

Ein Projekt, das Apache Commons IO bereits einbindet, kann FileUtils.getUserDirectory() für eine File oder FileUtils.getUserDirectoryPath() für einen Pfad als Zeichenkette verwenden. Diese Komfortmethoden machen es nicht überflüssig, den von der Java-Umgebung bereitgestellten Wert zu berücksichtigen. Für diesen einzelnen Abruf sind sie kein Grund, eine neue Abhängigkeit hinzuzufügen. Binden Sie die Bibliothek nur ein, wenn das Projekt sie bereits verwendet oder ihre weiteren E/A-Hilfsfunktionen benötigt.

Eine Methode auswählen und ihre Einschränkungen berücksichtigen

Für gewöhnliche Dateisystemaufgaben in Java rufen Sie user.home mit System.getProperty() ab und wandeln den Wert für die verwendete API in einen Path oder eine File um. Verwenden Sie System.getenv() nur, wenn Ihre Anwendung ausdrücklich von einer Umgebungsvariable abhängt, und berücksichtigen Sie, dass diese fehlen oder angepasst sein kann. Nutzen Sie Apache Commons IO, wenn die Bibliothek bereits zum Projekt gehört und ihr Rückgabetyp zu Ihrem Code passt.

Behandeln Sie den Wert des Home-Verzeichnisses als Ausgangspfad, nicht als Nachweis dafür, dass ein Verzeichnis existiert, beschreibbar ist oder sich für Anwendungsdaten eignet. Prüfen oder erstellen Sie Verzeichnisse mit den für Ihre Aufgabe erforderlichen Dateisystem-APIs und behandeln Sie deren dokumentierte E/A-Fehler. So bleiben der Abruf des Werts und die Dateisystemoperation getrennt, und die Annahmen Ihrer Anwendung sind klar.