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.

SacramentoJoe
quelle

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.

Joachim Sauer
quelle
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.)

Cobra Libre
quelle
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 .

KulDeep
quelle
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();
    }

}
user897493
quelle
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());
        }

    }
}
Vicky
quelle
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

Chris Kimpton
quelle
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

Naramsim
quelle
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

isaac.hazan
quelle
-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(); } }
Prithvish Mukherjee
quelle