Auf Eigenschaftendateien außerhalb der .jar zugreifen?

Ich habe eine .jar-Datei, die ich zusammenstelle. Ich möchte eine wirklich sehr einfache .properties-Datei mit konfigurierbaren Dingen wie dem Namen des Benutzers und anderen Dingen erstellen, so dass sie von Hand bearbeitet werden können, anstatt dass ich einen GUI-Editor einbauen muss.

Was ich tun möchte, ist in der Lage zu sein, in dieser Reihenfolge zu suchen:

  1. eine angegebene Eigenschaftendatei ( args[0] )
  2. MyApp.properties im aktuellen Verzeichnis (das Verzeichnis, von dem Java aufgerufen wurde)
  3. MyApp.properties im Benutzerverzeichnis (die Systemeigenschaft user.home ?)
  4. MyApp.properties in dem Verzeichnis, in dem die Anwendung .jar gespeichert ist

Ich weiß, wie ich auf # 1 und # 3 zugreifen kann (denke ich), aber wie kann ich zur Laufzeit # 2 und # 4 feststellen?

# 2 ist die Systemeigenschaft “user.dir” . # 3 ist die Eigenschaft “user.home”.

# 4 ist ein bisschen wie ein Klud, egal wie man sich ihm nähert. Hier ist eine alternative Technik, die funktioniert, wenn Sie eine class aus einer JAR geladen haben, die nicht im Systemklassenpfad enthalten ist.

 CodeSource src = MyClass.class.getProtectionDomain().getCodeSource(); if (src != null) { URL url = new URL(src.getLocation(), "MyApp.properties"); ... } else { /* Fail... */ } 

Für 4, könnten Sie dies versuchen. Hol dir den classnpfad:

 String classpath = System.getProperty("java.class.path"); 

Suchen Sie danach nach dem Namen Ihres Anwendungs-Jars:

 int jarPos = classpath.indexOf("application.jar"); 

Pars den Weg, der zu ihm führt:

 int jarPathPos = classpath.lastIndexOf(File.pathSeparatorChar, jarPos) + 1; String path = classpath.substring(jarPathPos, jarPos); 

MyApp.properties dann MyApp.properties . jarPos == -1 Sie darauf, nach jarPos == -1 zu jarPos == -1 , was bedeutet, dass das jar nicht gefunden wird, wenn der classnpfad (vielleicht in Ihrer Entwicklungsumgebung) verwendet wird.

Für das aktuelle Arbeitsverzeichnis:

 new File("."); 

Für eine Datei namens MyApp.properties im aktuellen Verzeichnis:

 new File(new File("."), "MyApp.properties");