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

115

J'ai besoin de lire un fichier de propriétés enfoui dans la structure de mon package com.al.common.email.templates.

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

En fin de compte, mon code fonctionnera dans un conteneur de servlet, 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.

SacramentoJoe
la source

Réponses:

235

Lors du chargement des propriétés d'une classe dans le package, com.al.common.email.templatesvous 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 n'est pas dans 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 '/' de début) dans getResource()/ getResourceAsStream()signifient que la ressource sera recherchée par rapport au répertoire qui représente le package dans lequel se trouve la classe.

Utiliser java.lang.String.class.getResource("foo.txt")rechercherait le fichier (inexistant) /java/lang/String/foo.txtsur le chemin de classe.

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

Joachim Sauer
la source
2
Suggestion: Ajoutez une explication quand utiliser des chemins relatifs et quand utiliser des chemins absolus (avec et sans le "/" au début).
Aaron Digulla
1
et si votre fichier de propriétés est en dehors du répertoire src mais toujours dans votre directeur de projet?
Jonathan
1
@jonney: Java lui-même n'a aucune notion de "répertoire de projet", certains IDE pourraient en avoir. Mais en ce qui concerne Java, il s'agit simplement d'un fichier quelque part dans le système de fichiers sans aucun rapport avec le chemin de classe.
Joachim Sauer
50

Pour ajouter à la réponse de Joachim Sauer, si jamais vous avez besoin de le faire dans un contexte statique, vous pouvez faire quelque chose comme ceci:

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

(La gestion des exceptions a été éludée, comme auparavant.)

cobra libre
la source
C'est la réponse qui a fonctionné pour moi. Je n'ai pas pu obtenir la réponse acceptée.
Steve HHH du
1
@cobralibre comment lire un fichier de propriétés qui réside dans un resourcesdossier dans un mavenprojet
Kasun Siyambalapitiya
16

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 avec 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 root/srcrépertoire pour un chargement 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 TestLoadProperties.classfichier pour un chargement réussi.

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

KulDeep
la source
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
la source
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
la source
2

En supposant que vous utilisez la classe Properties , via sa méthode de chargement , et je suppose que vous utilisez le ClassLoader getResourceAsStream pour obtenir le flux d'entrée.

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

Chris Kimpton
la source
1

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

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

De plus, vous devez mettre votre fichier any.properties dans / src / main / resources

Naramsim
la source
9
D'où venez-vous PropertiesUtil?
Ben Watson
1

Personne ne mentionne la solution similaire mais encore plus simple que ci-dessus sans avoir besoin de 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

isaac.hazan
la source
-2

utilisez le code ci-dessous s'il vous plaît:

    Propriétés p = nouvelles propriétés (); StringBuffer path = new StringBuffer ( "com / al / common / email / templates /" ); 
    chemin . append ( "foo.properties" ); InputStream fs = getClass (). getClassLoader () . getResourceAsStream ( chemin . 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
la source