Cargando un archivo de propiedades desde el paquete Java

115

Necesito leer los archivos de propiedades que están enterrados en la estructura de mi paquete en formato com.al.common.email.templates.

Lo he intentado todo y no puedo resolverlo.

Al final, mi código se ejecutará en un contenedor de servlets, pero no quiero depender del contenedor para nada. Escribo casos de prueba de JUnit y debe funcionar en ambos.

SacramentoJoe
fuente

Respuestas:

235

Al cargar las propiedades de una clase en el paquete com.al.common.email.templates, puede usar

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

(Agregue todo el manejo de excepciones necesario).

Si su clase no está en ese paquete, debe adquirir InputStream de manera ligeramente diferente:

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

Las rutas relativas (aquellas sin un '/' inicial) en getResource()/ getResourceAsStream()significan que el recurso se buscará en relación con el directorio que representa el paquete en el que se encuentra la clase.

El uso java.lang.String.class.getResource("foo.txt")buscaría el archivo (inexistente) /java/lang/String/foo.txten la ruta de clase.

Usar una ruta absoluta (una que comience con '/') significa que se ignora el paquete actual.

Joachim Sauer
fuente
2
Sugerencia: agregue una explicación de cuándo usar relativo y cuándo usar rutas absolutas (con y sin "/" al principio).
Aaron Digulla
1
¿Qué pasa si su archivo de propiedades está fuera del directorio src pero aún dentro de su director de proyecto?
Jonathan
1
@jonney: Java en sí mismo no tiene la noción de "directorio del proyecto", algunos IDE pueden tener eso. Pero en lo que respecta a Java, es simplemente un archivo en algún lugar del sistema de archivos sin ninguna relación con la ruta de clase.
Joachim Sauer
50

Para agregar a la respuesta de Joachim Sauer, si alguna vez necesita hacer esto en un contexto estático, puede hacer algo como lo siguiente:

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

(El manejo de excepciones elidió, como antes).

cobra libre
fuente
Esta es la respuesta que funcionó para mí. No pude conseguir que la respuesta aceptada funcionara.
Steve HHH
1
@cobralibre cómo leer un archivo de propiedades que reside en una resourcescarpeta en un mavenproyecto
Kasun Siyambalapitiya
16

Los siguientes dos casos se relacionan con la carga de un archivo de propiedades desde una clase de ejemplo llamada TestLoadProperties.

Caso 1: Cargando el archivo de propiedades usando ClassLoader

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

En este caso, el archivo de propiedades debe estar en el root/srcdirectorio para que se cargue correctamente.

Caso 2: cargar el archivo de propiedades sin usar ClassLoader

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

En este caso, el archivo de propiedades debe estar en el mismo directorio que el TestLoadProperties.classarchivo para que se cargue correctamente.

Nota: TestLoadProperties.java y TestLoadProperties.classson dos archivos diferentes. El primero, .javaarchivo, generalmente se encuentra en el src/directorio de un proyecto , mientras que el segundo, .classarchivo, generalmente se encuentra en su bin/directorio.

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

}
usuario897493
fuente
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
fuente
2

Suponiendo que está usando la clase Properties , a través de su método de carga , y supongo que está usando ClassLoader getResourceAsStream para obtener el flujo de entrada.

¿Cómo está pasando el nombre? Parece que debería estar en esta forma: /com/al/common/email/templates/foo.properties

Chris Kimpton
fuente
1

Logré solucionar este problema con esta llamada.

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

Además, debe poner su archivo anything.properties en / src / main / resources

Naramsim
fuente
9
¿Dónde se obtiene PropertiesUtila partir de?
Ben Watson
1

Nadie menciona la solución similar pero incluso más simple que la anterior sin necesidad de lidiar con el paquete de la clase. Suponiendo que myfile.properties está en classpath.

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

Disfrutar

isaac.hazan
fuente
-2

utilice el siguiente código por favor:

    Propiedades p = nuevas Propiedades (); StringBuffer ruta = new StringBuffer ( "com / al / common / email / templates /" ); 
    camino . append ( "foo.properties" ); InputStream fs = getClass (). getClassLoader () . getResourceAsStream ( ruta . 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
fuente