Ich habe den folgenden Code, der versucht, eine Eigenschaftendatei zu lesen:
Properties prop = new Properties();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream stream = loader.getResourceAsStream("myProp.properties");
prop.load(stream);
Ich bekomme eine Ausnahme in der letzten Zeile. Speziell:
Exception in thread "main" java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:418)
at java.util.Properties.load0(Properties.java:337)
at java.util.Properties.load(Properties.java:325)
at Assignment1.BaseStation.readPropertyFile(BaseStation.java:46)
at Assignment1.BaseStation.main(BaseStation.java:87)
Danke, Nikos
java
properties
Nikos
quelle
quelle
getResourceAsStream
sucht nach der Datei im Klassenpfad. Wenn sich Ihre Eigenschaftendatei im Paketverzeichnis von befindetmyPackage
, verwenden Sie sie/myPackage/myProp.properties
als Pfad.conf
Paket zum Speichern aller meiner Konfigurationsdateien habe und meine Dateihierarchie lautet:myproject ->src, conf, test
Wie lade ich die Eigenschaften, indem ich einen vorhergehenden Schrägstrich hinzufüge?Informationen finden Sie auf dieser Seite:
http://www.mkyong.com/java/java-properties-file-examples/
quelle
Reader
Inprop.load(reader)
gemäß der Dokumentation zu schließen:The specified stream remains open after this method returns
Sie können
ResourceBundle
class verwenden, um die Eigenschaftendatei zu lesen.quelle
conf/filename.properties
basierend auf dem Projektstammverzeichnisquelle
Sie können dieses Schlüsselwort nicht verwenden wie -
in einem statischen Kontext.
Das Beste wäre, den Anwendungskontext wie - zu erfassen.
dann können Sie die Ressourcendatei aus dem Klassenpfad laden -
Dies funktioniert sowohl für den statischen als auch für den nicht statischen Kontext. Das Beste daran ist, dass sich diese Eigenschaftendatei in einem beliebigen Paket / Ordner befinden kann, das im Klassenpfad der Anwendung enthalten ist.
quelle
Ihre Datei sollte wie
com/example/foo/myProps.properties
im Klassenpfad verfügbar sein . Dann laden Sie es als:quelle
Wenn sich Ihre config.properties nicht im Verzeichnis src / main / resource und im Stammverzeichnis des Projekts befindet, müssen Sie Folgendes tun: -
quelle
Stellen Sie sicher, dass der Dateiname korrekt ist und sich die Datei tatsächlich im Klassenpfad befindet.
getResourceAsStream()
gibt null zurück, wenn dies nicht der Fall ist, wodurch die letzte Zeile die Ausnahme auslöst.Wenn sich myProp.properties im Stammverzeichnis Ihres Projekts befindet, verwenden Sie
/myProp.properties
stattdessen.quelle
Sie können java.io.InputStream verwenden, um die Datei wie folgt zu lesen:
quelle
In Anbetracht des Kontextes
loader.getResourceAsStream("myPackage/myProp.properties")
sollte verwendet werden.Führen
'/'
funktioniert nicht mitClassLoader.getResourceAsStream(String)
Methoden.Alternativ können Sie eine
Class.getResourceAsStream(String)
Methode verwenden,'/'
mit der ermittelt wird, ob der Pfad absolut oder relativ zum Klassenort ist.Beispiele:
quelle
Wenn Ihr Eigenschaftendateipfad und Ihr Java-Klassenpfad identisch sind, sollten Sie dies tun.
Beispielsweise:
quelle
Keine der aktuellen Antworten zeigt das
InputStream
Schließen an (dies führt zu einem Verlust eines Dateideskriptors) und / oder behandelt nicht die.getResourceAsStream()
Rückgabe von null, wenn die Ressource nicht gefunden wird (dies führt zu einerNullPointerException
verwirrenden Meldung"inStream parameter is null"
). Sie benötigen etwa Folgendes:quelle
Zum Lesen der Eigenschaftendatei mit ihrer ursprünglichen Reihenfolge:
quelle
Viele Antworten beschreiben hier gefährliche Methoden, bei denen sie einen Dateieingabestream instanziieren, aber keinen Verweis auf den Eingabestream erhalten, um den Stream später zu schließen. Dies führt zu baumelnden Eingabestreams und Speicherlecks. Die korrekte Art des Ladens der Eigenschaften sollte wie folgt aussehen:
Beachten Sie die Instanziierung des Dateieingabestreams im
try-with-resources
Block. Da aFileInputStream
automatisch geschlossen werden kann, wird es nach demtry-with-resources
Verlassen des Blocks automatisch geschlossen . Wenn Sie einen einfachentry
Block verwenden möchten , müssen Sie ihn explizit mitfis.close();
imfinally
Block schließen.quelle
Ich sehe, dass die Frage alt ist. Wenn jemand in Zukunft darauf stößt, denke ich, dass dies eine einfache Möglichkeit ist, dies zu tun. Bewahren Sie die Eigenschaftendatei in Ihrem Projektordner auf.
quelle
Geben Sie den Pfad ab src wie folgt an:
quelle