Frage

Ich brauche eine Eigenschaft zu lesen, Dateien, die in meiner Paketstruktur in com.al.common.email.templates begraben wird.

Ich habe versucht, alles und ich kann es nicht herausgefunden.

Am Ende meines Code wird in einem Servlet-Containern ausgeführt werden, aber ich will nicht für irgendetwas auf den Behälter ab. Ich schreibe JUnit-Testfälle, und es muss in den beiden arbeiten.

War es hilfreich?

Lösung

Wenn Sie von einer Klasse, die Eigenschaften Laden im Paket com.al.common.email.templates Sie verwenden können,

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

(In aller notwendige Ausnahmebehandlung).

Wenn Ihre Klasse nicht in diesem Paket ist, müssen Sie die Input etwas anders erwerben:

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

Relative Pfade (die ohne führenden ‚/‘) in getResource() / getResourceAsStream() bedeuten, dass die Ressource in das Verzeichnis relativ gesucht werden, die das Paket repräsentiert die Klasse befindet.

java.lang.String.class.getResource("foo.txt") Verwendung für die (nicht vorhandene) Datei /java/lang/String/foo.txt auf dem Classpath suchen würde.

Unter Verwendung einen absoluten Pfad (eine, die mit ‚/‘ beginnt) bedeutet, dass das aktuelle Paket ignoriert wird.

Andere Tipps

In den Joachim Sauer Antwort, wenn Sie jemals in einem statischen Kontext tun müssen, können Sie so etwas wie die folgenden tun:

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

(Ausnahme elided Handhabung, wie zuvor.)

Die folgenden zwei Fälle betreffen eine Eigenschaftendatei aus einem Beispiel Klasse mit dem Namen TestLoadProperties zu laden.

Fall 1: Laden der Eigenschaften-Datei mit ClassLoader

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

In diesem Fall wird die Eigenschaften-Datei im Verzeichnis root/src für eine erfolgreichen Laden sein muss.

Fall 2: Laden Sie die Eigenschaftendatei ohne ClassLoader mit

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

In diesem Fall wird die Eigenschaften-Datei im selben Verzeichnis wie die TestLoadProperties.class Datei für eine erfolgreichen Laden sein muss.

Hinweis: TestLoadProperties.java und TestLoadProperties.class sind zwei verschiedene Dateien. Die ehemalige, .java Datei wird in der Regel in einem Projekt src/ Verzeichnis, während die letzteren, .class Datei gefunden wird, wird in der Regel in ihrem bin/ Verzeichnis.

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

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

    }
}

Angenommen, Ihre Verwendung des Properties Klasse, über seine laden Methode, und ich denke, Sie werden mit dem Classloader getResourceAsStream den Eingangsstrom zu erhalten.

Wie geht es Ihnen im Namen vorbei, so scheint es in dieser Form sein sollte: /com/al/common/email/templates/foo.properties

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

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

Extra, Sie haben Ihre whatever.properties setzen Datei in / src / main / resources

Niemand erwähnt das ähnlich, aber noch einfachere Lösung als oben, ohne dass mit dem Paket der Klasse zu behandeln. myfile.properties ist in dem Classpath angenommen wird.

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

Genießen

verwenden Sie den Code unten bitte:     

    Properties p = new Properties(); 
    StringBuffer path = new StringBuffer("com/al/common/email/templates/");
    path.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(); } }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top