Carregando um arquivo de propriedades do pacote Java

115

Preciso ler os arquivos de propriedades que estão enterrados na estrutura do meu pacote em com.al.common.email.templates.

Já tentei de tudo e não consigo descobrir.

No final, meu código será executado em um contêiner de servlet, mas não quero depender do contêiner para nada. Eu escrevo casos de teste JUnit e ele precisa funcionar em ambos.

SacramentoJoe
fonte

Respostas:

235

Ao carregar as propriedades de uma classe no pacote, com.al.common.email.templatesvocê pode usar

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

(Adicione todo o tratamento de exceção necessário).

Se sua classe não estiver nesse pacote, você precisará adquirir o InputStream de maneira um pouco diferente:

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

Caminhos relativos (aqueles sem um '/' inicial) em getResource()/ getResourceAsStream()significam que o recurso será pesquisado em relação ao diretório que representa o pacote em que a classe está.

Usando java.lang.String.class.getResource("foo.txt")iria procurar o arquivo (inexistente) /java/lang/String/foo.txtno classpath.

Usar um caminho absoluto (aquele que começa com '/') significa que o pacote atual é ignorado.

Joachim Sauer
fonte
2
Sugestão: adicione uma explicação sobre quando usar caminhos relativos e quando usar caminhos absolutos (com e sem "/" no início).
Aaron Digulla
1
e se o arquivo de propriedades estiver fora do diretório src, mas ainda dentro do diretor de projeto?
Jonathan
1
@jonney: Java em si não tem noção de "diretório de projeto", alguns IDEs podem ter isso. Mas, no que diz respeito ao Java, ele é simplesmente um arquivo em algum lugar do sistema de arquivos sem nenhuma relação com o caminho de classe.
Joachim Sauer
50

Para aumentar a resposta de Joachim Sauer, se você precisar fazer isso em um contexto estático, pode fazer algo como o seguinte:

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

(Tratamento de exceções eliminado, como antes.)

cobra libre
fonte
Esta é a resposta que funcionou para mim. Não consegui que a resposta aceita funcionasse.
Steve HHH
1
@cobralibre como ler um arquivo de propriedades que reside em uma resourcespasta em um mavenprojeto
Kasun Siyambalapitiya
16

Os dois casos a seguir estão relacionados ao carregamento de um arquivo de propriedades de uma classe de exemplo chamada TestLoadProperties.

Caso 1: Carregando o arquivo de propriedades usando ClassLoader

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

Nesse caso, o arquivo de propriedades deve estar no root/srcdiretório para carregamento bem-sucedido.

Caso 2: Carregando o arquivo de propriedades sem usar ClassLoader

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

Nesse caso, o arquivo de propriedades deve estar no mesmo diretório que o TestLoadProperties.classarquivo para um carregamento bem-sucedido.

Nota: TestLoadProperties.java e TestLoadProperties.classsão dois arquivos diferentes. O primeiro, .javaarquivo, geralmente é encontrado no src/diretório de um projeto , enquanto o último, .classarquivo, geralmente é encontrado em seu bin/diretório.

KulDeep
fonte
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
fonte
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
fonte
2

Supondo que você esteja usando a classe Properties , por meio de seu método load , e eu acho que você está usando ClassLoader getResourceAsStream para obter o fluxo de entrada.

Como você está passando no nome, parece que deveria ser desta forma: /com/al/common/email/templates/foo.properties

Chris Kimpton
fonte
1

Eu consegui resolver esse problema com esta ligação

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

Extra, você tem que colocar seu arquivo what.properties em / src / main / resources

Naramsim
fonte
9
De onde você está PropertiesUtilsaindo?
Ben Watson
1

Ninguém menciona a solução semelhante, mas ainda mais simples do que a anterior, sem necessidade de lidar com o pacote da aula. Supondo que myfile.properties esteja no caminho de classe.

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

Aproveitar

isaac.hazan
fonte
-2

use o código abaixo, por favor:

    Propriedades p = novas Propriedades (); StringBuffer path = new StringBuffer ( "com / al / common / email / templates /" ); 
    caminho . 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
fonte