Lesen der Eigenschaftendatei in Java


105

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

Antworten:


89

Basierend auf Ihrer Ausnahme ist der InputStreamWert null. Dies bedeutet, dass der Klassenlader Ihre Eigenschaftendatei nicht findet. Ich vermute, dass myProp.properties im Stammverzeichnis Ihres Projekts liegt. Wenn dies der Fall ist, benötigen Sie einen vorhergehenden Schrägstrich:

InputStream stream = loader.getResourceAsStream("/myProp.properties");

Meine Dateihierarchie lautet: src -> myPackage -> myClass.java, myProp.properties. Ich habe getan, was Sie mir geraten haben, aber es gibt immer noch die gleiche Ausnahme
Nikos

getResourceAsStreamsucht nach der Datei im Klassenpfad. Wenn sich Ihre Eigenschaftendatei im Paketverzeichnis von befindet myPackage, verwenden Sie sie /myPackage/myProp.propertiesals Pfad.
Jesper

2
@ Mark Elliot Was ist, wenn ich ein confPaket zum Speichern aller meiner Konfigurationsdateien habe und meine Dateihierarchie lautet: myproject ->src, conf, testWie lade ich die Eigenschaften, indem ich einen vorhergehenden Schrägstrich hinzufüge?
Roger Ray

54


Informationen finden Sie auf dieser Seite:
http://www.mkyong.com/java/java-properties-file-examples/

Properties prop = new Properties();
try {
    //load a properties file from class path, inside static method
    prop.load(App.class.getClassLoader().getResourceAsStream("config.properties"));

    //get the property value and print it out
    System.out.println(prop.getProperty("database"));
    System.out.println(prop.getProperty("dbuser"));
    System.out.println(prop.getProperty("dbpassword"));

} 
catch (IOException ex) {
    ex.printStackTrace();
}

3
Vergessen Sie nicht, das ReaderIn prop.load(reader)gemäß der Dokumentation zu schließen:The specified stream remains open after this method returns
Evandro Silva

25

Sie können ResourceBundleclass verwenden, um die Eigenschaftendatei zu lesen.

ResourceBundle rb = ResourceBundle.getBundle("myProp.properties");

1
ResourceBundle rb = ResourceBundle.getBundle ("myProp");
mcolak

2
Dieser Ansatz wird für i18n empfohlen .
weiterer

15
Properties prop = new Properties();

try {
    prop.load(new FileInputStream("conf/filename.properties"));
} catch (IOException e) {
    e.printStackTrace();
}

conf/filename.properties basierend auf dem Projektstammverzeichnis


7

Sie können dieses Schlüsselwort nicht verwenden wie -

props.load(this.getClass().getResourceAsStream("myProps.properties"));

in einem statischen Kontext.

Das Beste wäre, den Anwendungskontext wie - zu erfassen.

ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/META-INF/spring/app-context.xml");

dann können Sie die Ressourcendatei aus dem Klassenpfad laden -

//load a properties file from class path, inside static method
        prop.load(context.getClassLoader().getResourceAsStream("config.properties"));

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.


4
ApplicationContext ist nur im Falle einer Frühlingsanwendung verfügbar
joro

6

Ihre Datei sollte wie com/example/foo/myProps.propertiesim Klassenpfad verfügbar sein . Dann laden Sie es als:

props.load(this.getClass().getResourceAsStream("myProps.properties"));

4

Wenn sich Ihre config.properties nicht im Verzeichnis src / main / resource und im Stammverzeichnis des Projekts befindet, müssen Sie Folgendes tun: -

Properties prop = new Properties();          
File configFile = new File(myProp.properties);
InputStream stream = new FileInputStream(configFile);
prop.load(stream);

3

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.propertiesstattdessen.


Meine Dateihierarchie lautet: src -> myPackage -> myClass.java, myProp.properties. Ich habe getan, was Sie mir geraten haben, aber es gibt immer noch die gleiche Ausnahme
Nikos

Da sich Ihre Eigenschaftendatei nicht im Stammverzeichnis Ihres Projekts befindet, benötigen Sie keinen führenden Schrägstrich.
Mort

Ich bekam die Ausnahme überhaupt ohne den führenden Schrägstrich. Es funktioniert immer noch nicht.
Nikos

3

Sie können java.io.InputStream verwenden, um die Datei wie folgt zu lesen:

InputStream inputStream = getClass().getClassLoader().getResourceAsStream(myProps.properties); 

Wie konvertiere ich InputStream in eine Datei in Java? Ich wollte die .properties-Datei mit der Datei-API lesen

3

In Anbetracht des Kontextes loader.getResourceAsStream("myPackage/myProp.properties")sollte verwendet werden.

Führen '/'funktioniert nicht mit ClassLoader.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:

myClass.class.getResourceAsStream("myProp.properties")
myClass.class.getResourceAsStream("/myPackage/myProp.properties")

2

Wenn Ihr Eigenschaftendateipfad und Ihr Java-Klassenpfad identisch sind, sollten Sie dies tun.

Beispielsweise:

src / myPackage / MyClass.java

src / myPackage / MyFile.properties

Properties prop = new Properties();
InputStream stream = MyClass.class.getResourceAsStream("MyFile.properties");
prop.load(stream);

2

Keine der aktuellen Antworten zeigt das InputStreamSchließ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 einer NullPointerExceptionverwirrenden Meldung "inStream parameter is null"). Sie benötigen etwa Folgendes:

String propertiesFilename = "server.properties";
Properties prop = new Properties();
try (var inputStream = getClass().getClassLoader().getResourceAsStream(propertiesFilename)) {
    if (inputStream == null) {
        throw new FileNotFoundException(propertiesFilename);
    }
    prop.load(inputStream);
} catch (IOException e) {
    throw new RuntimeException(
                "Could not read " + propertiesFilename + " resource file: " + e);
}

1

Zum Lesen der Eigenschaftendatei mit ihrer ursprünglichen Reihenfolge:

    File file = new File("../config/edc.properties");
    PropertiesConfiguration config = new PropertiesConfiguration();
    PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config);
    layout.load(new InputStreamReader(new FileInputStream(file)));

    for(Object propKey : layout.getKeys()){
        PropertiesConfiguration propval =  layout.getConfiguration();
        String value = propval.getProperty((String) propKey).toString();
        out.print("Current Key:" + propkey + "Current Value:" + propval + "<br>");
    }

1

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:

    Properties prop = new Properties();
    try(InputStream fis = new FileInputStream("myProp.properties")) {
        prop.load(fis);
    }
    catch(Exception e) {
        System.out.println("Unable to find the specified properties file");
        e.printStackTrace();
        return;
    }

Beachten Sie die Instanziierung des Dateieingabestreams im try-with-resourcesBlock. Da a FileInputStreamautomatisch geschlossen werden kann, wird es nach dem try-with-resourcesVerlassen des Blocks automatisch geschlossen . Wenn Sie einen einfachen tryBlock verwenden möchten , müssen Sie ihn explizit mit fis.close();im finallyBlock schließen.


0

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.

        FileReader reader = new FileReader("Config.properties");

        Properties prop = new Properties();
        prop.load(reader);

-2

Geben Sie den Pfad ab src wie folgt an:

src/main/resources/myprop.proper
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.