Cargando un archivo de propiedades del paquete Java

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

Lo intenté 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 JUnit y debe funcionar en ambos.

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, necesita adquirir el InputStream de forma ligeramente diferente:

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

Las rutas relativas (las que no tienen un ‘/’) en getResource() / getResourceAsStream() significan que se buscará el recurso 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 classpath.

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

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 se eliminó, como antes).

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

Caso 1: carga del 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 directorio root/src para una carga exitosa.

Caso 2: carga del 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 archivo TestLoadProperties.class para una carga exitosa.

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

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

Asumiendo que usas la clase de Propiedades , a través de su método de carga , y supongo que estás usando el ClassLoader getResourceAsStream para obtener la stream de entrada.

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

Logré resolver este problema con esta llamada

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

Extra, debes poner tu archivo whatever.properties en / src / main / resources

Nadie menciona la solución similar pero 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(); 

Disfrutar

use el siguiente código por favor:

     Propiedades p = nuevas Propiedades (); 
     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(); } }