Laden einer Eigenschaftendatei aus einem Java-Paket


115

Ich muss eine Eigenschaftendatei lesen, die in meiner Paketstruktur in vergraben ist com.al.common.email.templates.

Ich habe alles versucht und kann es nicht herausfinden.

Am Ende wird mein Code in einem Servlet-Container ausgeführt, aber ich möchte für nichts vom Container abhängig sein. Ich schreibe JUnit-Testfälle und es muss in beiden funktionieren.

Antworten:


235

Beim Laden der Eigenschaften aus einer Klasse in das Paket können com.al.common.email.templatesSie verwenden

Properties prop = new Properties();
InputStream in = getClass().getResourceAsStream("foo.properties");
prop.load(in);
in.close();

(Fügen Sie alle erforderlichen Ausnahmebehandlungen hinzu).

Wenn Ihre Klasse nicht in diesem Paket enthalten ist, müssen Sie den InputStream etwas anders erwerben:

InputStream in = 
 getClass().getResourceAsStream("/com/al/common/email/templates/foo.properties");

Relative Pfade (solche ohne führendes '/') in getResource()/ getResourceAsStream()bedeuten, dass die Ressource relativ zu dem Verzeichnis durchsucht wird, das das Paket darstellt, in dem sich die Klasse befindet.

Mit java.lang.String.class.getResource("foo.txt")würde nach der (nicht vorhandenen) Datei /java/lang/String/foo.txtim Klassenpfad suchen .

Die Verwendung eines absoluten Pfads (einer, der mit '/' beginnt) bedeutet, dass das aktuelle Paket ignoriert wird.


2
Vorschlag: Fügen Sie eine Erklärung hinzu, wann relative und wann absolute Pfade verwendet werden sollen (mit und ohne "/" am Anfang).
Aaron Digulla

1
Was ist, wenn sich Ihre Eigenschaftendatei außerhalb des src-Verzeichnisses, aber immer noch in Ihrem Projektleiter befindet?
Jonathan

1
@jonney: Java selbst hat keine Vorstellung von "Projektverzeichnis", einige IDEs haben das möglicherweise. Für Java ist es jedoch einfach eine Datei irgendwo im Dateisystem, die überhaupt keine Beziehung zum Klassenpfad hat.
Joachim Sauer

50

Um die Antwort von Joachim Sauer zu ergänzen: Wenn Sie dies jemals in einem statischen Kontext tun müssen, können Sie Folgendes tun:

static {
  Properties prop = new Properties();
  InputStream in = CurrentClassName.class.getResourceAsStream("foo.properties");
  prop.load(in);
  in.close()
}

(Ausnahmebehandlung entfällt wie zuvor.)


Dies ist die Antwort, die für mich funktioniert hat. Ich konnte die akzeptierte Antwort nicht zur Arbeit bringen.
Steve HHH

1
@ Cobralibre, wie man eine Eigenschaftendatei liest, die sich in einem resourcesOrdner in einem mavenProjekt befindet
Kasun Siyambalapitiya

16

Die folgenden zwei Fälle beziehen sich auf das Laden einer Eigenschaftendatei aus einer Beispielklasse mit dem Namen TestLoadProperties.

Fall 1: Laden der Eigenschaftendatei mit ClassLoader

InputStream inputStream = TestLoadProperties.class.getClassLoader()
                          .getResourceAsStream("A.config");
properties.load(inputStream);

In diesem Fall muss sich die Eigenschaftendatei im root/srcVerzeichnis befinden, damit das Laden erfolgreich ist.

Fall 2: Laden der Eigenschaftendatei ohne Verwendung ClassLoader

InputStream inputStream = getClass().getResourceAsStream("A.config");
properties.load(inputStream);

In diesem Fall muss sich die Eigenschaftendatei im selben Verzeichnis wie die TestLoadProperties.classDatei befinden, damit das Laden erfolgreich ist.

Hinweis: TestLoadProperties.java und TestLoadProperties.classsind zwei verschiedene Dateien. Die erstere .javaDatei befindet sich normalerweise im src/Verzeichnis eines Projekts , während die letztere .classDatei normalerweise im bin/Verzeichnis eines Projekts gefunden wird .


12
public class Test{  
  static {
    loadProperties();
}
   static Properties prop;
   private static void loadProperties() {
    prop = new Properties();
    InputStream in = Test.class
            .getResourceAsStream("test.properties");
    try {
        prop.load(in);
        in.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

10
public class ReadPropertyDemo {
    public static void main(String[] args) {
        Properties properties = new Properties();

        try {
            properties.load(new FileInputStream(
                    "com/technicalkeeda/demo/application.properties"));
            System.out.println("Domain :- " + properties.getProperty("domain"));
            System.out.println("Website Age :- "
                    + properties.getProperty("website_age"));
            System.out.println("Founder :- " + properties.getProperty("founder"));

            // Display all the values in the form of key value
            for (String key : properties.stringPropertyNames()) {
                String value = properties.getProperty(key);
                System.out.println("Key:- " + key + "Value:- " + value);
            }

        } catch (IOException e) {
            System.out.println("Exception Occurred" + e.getMessage());
        }

    }
}

2

Angenommen , Ihre Verwendung der Eigenschaften - Klasse, über seine Last - Methode, und ich denke , Sie die Classloader verwenden getResourceAsStream den Eingangsstrom zu erhalten.

Wie geben Sie den Namen weiter, es scheint, dass es in dieser Form sein sollte: /com/al/common/email/templates/foo.properties


1

Ich habe es geschafft, dieses Problem mit diesem Aufruf zu lösen

Properties props = PropertiesUtil.loadProperties("whatever.properties");

Außerdem müssen Sie Ihre Datei Whatever.properties in / src / main / resources ablegen


9
Woher kommst du PropertiesUtil?
Ben Watson

1

Niemand erwähnt die ähnliche, aber noch einfachere Lösung als oben, ohne sich mit dem Paket der Klasse befassen zu müssen. Angenommen, myfile.properties befindet sich im Klassenpfad.

        Properties properties = new Properties();
        InputStream in = ClassLoader.getSystemResourceAsStream("myfile.properties");
        properties.load(in);
        in.close();

Genießen


-2

Verwenden Sie bitte den folgenden Code:

    Eigenschaften p = neue Eigenschaften (); StringBuffer path = new StringBuffer ( "com / al / common / email / templates /" ); 
    Pfad . append ( "foo.properties" ); InputStream fs = getClass (). getClassLoader () . getResourceAsStream ( path . toString ());   
      
    
                                    

if(fs == null){ System.err.println("Unable to load the properties file"); } else{ try{ p.load(fs); } catch (IOException e) { e.printStackTrace(); } }
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.