Laden einer Datei Eigenschaften von Java-Paket
-
22-07-2019 - |
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.
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();
}
}