2008-12-02 17 views
98

Necesito leer un archivo de propiedades que está oculto en la estructura de mi paquete en com.al.common.email.templates.Cargando un archivo de propiedades del paquete Java

He intentado todo y no puedo resolverlo.

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

Respuesta

217

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

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

(Añadir todo el manejo de excepciones es necesario).

Si la clase no está en ese paquete, es necesario adquirir el InputStream ligeramente diferente:

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

Las rutas relativas (aquellos sin un líder '/') en getResource()/getResourceAsStream() significa que el recurso será buscado en relación con el directorio que representa el paquete en el que está la clase.

El uso de java.lang.String.class.getResource("foo.txt") buscaría el archivo (inexistente) /java/lang/String/foo.txt en el classpath.

El uso de una ruta absoluta (que comienza con '/') significa que se ignora el paquete actual.

+0

supongo que el segundo fragmento es la respuesta a la pregunta .. – Satya

+1

Sugerencia: Añada una explicación cuándo utilizar relativa y cuándo usar rutas absolutas (con y sin el "/" al comenzando). –

+0

Traté de dar una explicación. –

2

Suponiendo que usa la clase Properties, a través de su método load, y supongo que está utilizando el ClassLoader getResourceAsStream para obtener la secuencia de entrada.

¿Cómo estás pasando el nombre, parece que debería ser en esta forma: /com/al/common/email/templates/foo.properties

42

Para añadir a la respuesta de Joachim Sauer, si alguna vez tiene que 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() 
} 

(manejo de excepciones elididas, como antes.)

+0

Esta es la respuesta que funcionó para mí. No pude lograr que la respuesta aceptada funcionara. –

+0

@cobralibre cómo leer un archivo de propiedades que se encuentra en la carpeta 'resources' en un proyecto' maven' –

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

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

    } 
} 
13

Los dos casos siguientes se refieren a la carga de un archivo de propiedades de una clase de ejemplo denominada TestLoadProperties.

Caso 1: Cargar el archivo de propiedades utilizando ClassLoader

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

En este caso, el archivo de propiedades debe estar en el directorio root/src para la carga exitosa.

Caso 2: Cargar el archivo de propiedades sin utilizar ClassLoader

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

En este caso, el archivo de propiedades deben estar en el mismo directorio que el archivo TestLoadProperties.class para la carga exitosa.

Nota:TestLoadProperties.java y TestLoadProperties.class son dos archivos diferentes. El primero, el archivo .java, generalmente se encuentra en el directorio de un proyecto src/, mientras que el último, el archivo .class, se encuentra generalmente en su directorio bin/.

-2

usar el siguiente código 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(); } }
2

I logrado solucionar este problema con esta llamada

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

adicional, usted tiene que poner su archivo whatever.properties en/src/main/resources

+4

¿De dónde sacas 'PropertiesUtil'? –

0

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

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

Disfrute

Cuestiones relacionadas