web-dev-qa-db-fra.com

Chargement d'un fichier de propriétés à partir du package Java

Je dois lire un fichier de propriétés qui est enterré dans la structure de mon package dans com.al.common.email.templates.

J'ai tout essayé et je n'arrive pas à comprendre.

En fin de compte, mon code sera exécuté dans un conteneur de servlets, mais je ne veux pas dépendre du conteneur pour quoi que ce soit. J'écris des cas de test JUnit et il doit fonctionner dans les deux cas.

109
SacramentoJoe

Lors du chargement des propriétés d’une classe dans le package com.al.common.email.templates, vous pouvez utiliser

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

(Ajoutez toute la gestion des exceptions nécessaire).

Si votre classe ne fait pas partie de ce package, vous devez acquérir le InputStream légèrement différemment:

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

Les chemins relatifs (ceux sans précédant '/') dans getResource()/getResourceAsStream() signifient que la ressource sera recherchée par rapport au répertoire qui représente le paquet dans lequel se trouve la classe.

Utiliser Java.lang.String.class.getResource("foo.txt") permet de rechercher le fichier (inexistant) /Java/lang/String/foo.txt sur le chemin de classe.

L'utilisation d'un chemin absolu (qui commence par '/') signifie que le package actuel est ignoré.

232
Joachim Sauer

Pour ajouter à la réponse de Joachim Sauer, si vous avez besoin de le faire dans un contexte statique, vous pouvez procéder de la manière suivante:

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

(Traitement des exceptions éliminé, comme avant.)

48
cobra libre

Les deux cas suivants concernent le chargement d'un fichier de propriétés à partir d'un exemple de classe nommé TestLoadProperties.

Cas 1: Chargement du fichier de propriétés en utilisant ClassLoader

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

Dans ce cas, le fichier de propriétés doit se trouver dans le répertoire root/src pour que le chargement soit réussi.

Cas 2: Chargement du fichier de propriétés sans utiliser ClassLoader

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

Dans ce cas, le fichier de propriétés doit se trouver dans le même répertoire que le fichier TestLoadProperties.class pour que le chargement soit réussi.

Remarque:TestLoadProperties.Java et TestLoadProperties.class sont deux fichiers différents. Le premier fichier .Java se trouve généralement dans le répertoire src/ d'un projet, tandis que le second, le fichier .class, se trouve généralement dans son répertoire bin/.

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

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

    }
}
8
Vicky

En supposant que vous utilisiez la classe Propriétés , via sa méthode load , et je suppose que vous utilisez le ClassLoader getResourceAsStream pour obtenir le flux d'entrée.

Comment allez-vous passer dans le nom, il semble qu'il devrait être sous cette forme: /com/al/common/email/templates/foo.properties

2
Chris Kimpton

Personne ne mentionne une solution similaire mais encore plus simple que ci-dessus sans avoir à traiter le package de la classe. En supposant que myfile.properties se trouve dans le chemin de classe.

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

Prendre plaisir

1
isaac.hazan

J'ai réussi à résoudre ce problème avec cet appel

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

En plus, vous devez mettre votre fichier what.properties dans/src/main/resources

1
Naramsim