Carregando um arquivo de propriedades do pacote de Java
-
22-07-2019 - |
Pergunta
Eu preciso ler arquivos de propriedades que está enterrado na minha estrutura de pacotes em com.al.common.email.templates
.
Eu tentei tudo e eu não consigo entender.
No final, o meu código será executado em um contêiner de servlet, mas eu não quero depender do recipiente para nada. I escrever casos de teste JUnit e ele precisa de trabalho em ambos.
Solução
Ao carregar as propriedades de uma classe na com.al.common.email.templates
pacote que você pode usar
Properties prop = new Properties();
InputStream in = getClass().getResourceAsStream("foo.properties");
prop.load(in);
in.close();
(Incluir todo o tratamento de exceção necessário).
Se sua classe não está nesse pacote, você precisa adquirir o InputStream ligeiramente diferente:
InputStream in =
getClass().getResourceAsStream("/com/al/common/email/templates/foo.properties");
Os caminhos relativos (aqueles sem um líder '/') em getResource()
/ getResourceAsStream()
significa que o recurso serão pesquisadas em relação ao directório que representa o pacote é a classe em.
Usando java.lang.String.class.getResource("foo.txt")
iria procurar o (inexistente) /java/lang/String/foo.txt
arquivo no classpath.
Usando um caminho absoluto (que começa com '/') significa que o pacote atual é ignorada.
Outras dicas
Para adicionar a resposta de Joachim Sauer, se você precisar fazer isso em um contexto estático, você pode fazer algo como o seguinte:
static {
Properties prop = new Properties();
InputStream in = CurrentClassName.class.getResourceAsStream("foo.properties");
prop.load(in);
in.close()
}
(manipulação de exceção elidida, como antes.)
Os dois casos seguintes referem-se a carregar um arquivo de propriedades a partir de um exemplo de classe chamado TestLoadProperties
.
Caso 1: Carregando o arquivo de propriedades usando ClassLoader
InputStream inputStream = TestLoadProperties.class.getClassLoader()
.getResourceAsStream("A.config");
properties.load(inputStream);
Neste caso, o arquivo de propriedades deve estar no diretório root/src
para o carregamento bem sucedido.
Caso 2: Carregando o arquivo de propriedades sem usar ClassLoader
InputStream inputStream = getClass().getResourceAsStream("A.config");
properties.load(inputStream);
Neste caso, o arquivo de propriedades deve estar no mesmo diretório que o arquivo TestLoadProperties.class
para o carregamento bem sucedido.
Nota: TestLoadProperties.java
e TestLoadProperties.class
são dois arquivos diferentes. O primeiro, arquivo .java
, é normalmente encontrado no diretório src/
de um projeto, enquanto o último, arquivo .class
, é normalmente encontrado em seu diretório bin/
.
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());
}
}
}
Assumindo que o seu usando o Propriedades classe, através da sua método de carga , e eu acho que você está usando o ClassLoader getResourceAsStream para obter o fluxo de entrada.
Como você está passando o nome, parece que deveria ser desta forma: /com/al/common/email/templates/foo.properties
Eu consegui resolver este problema com esta chamada
Properties props = PropertiesUtil.loadProperties("whatever.properties");
extra, você tem que colocar seu arquivo whatever.properties em recursos / src / / main
Ninguém menciona a solução semelhante, mas ainda mais simples do que acima sem a necessidade de lidar com o pacote da classe. Assumindo myfile.properties está no classpath.
Properties properties = new Properties();
InputStream in = ClassLoader.getSystemResourceAsStream("myfile.properties");
properties.load(in);
in.close();
Aproveite
usar o código abaixo, por favor:
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();
}
}