Cargar un fichero de propiedades en Java

En esta entrada voy a explicar cómo cargar un fichero de propiedades de Java. Esta operación aunque sencilla puede ayudarnos mucho en la separación de responsabilidades entre las distintas partes de nuestro sistema.

Por ejemplo, si tenemos que mostrar una serie de mensajes por pantalla. En lugar de embeber los mensajes dentro del código Java escribiremos dichos mensajes en un fichero .properties asociados cada uno a una clave. Si en un futuro queremos cambiar los mensajes, podemos simplemente cambiar el fichero de propiedades sin tener la necesidad de cambiar el código fuente y volver a compilar la clase donde estuvieran.

En primer lugar vamos a hablar de la localización de los ficheros de propiedades. Los ficheros de propiedades deben guardarse en los paquetes Java, junto a las clases. Aunque podemos crear un paquete específico para dicho fichero. Supongamos a partir de ahora que hemos creado el fichero de propiedades en el paquete:
  • org.tutorialexception
Si estamos trabajando con un proyecto Maven, tendremos una estructura de directorios parecida a esta. En este caso, los ficheros de propiedades se almacenarán bajo el directorio 'src/main/resources' en lugar de estar junto a las clases Java (situadas en 'src/main/java'). No obstante pueden tener su propio paquete por lo que, siguiendo con el ejemplo, lo guardaríamos en la ruta:
  • src/main/resources/org/tutorialexception
Supongamos que nuestro fichero de propiedades tiene como nombre mensajes.properties y cuyo contenido es el siguiente:

#Mensajes
saludo=Hola
sujeto=amigo

Pues bien, podemos cargar y utilizar el fichero de propiedades de la siguiente forma:

package org.tutorialexception;

import java.io.IOException;
import java.util.Properties;

public class Main {
public static void main(String[] args) {
Properties info  = new Properties();
try {
info.load(Main.class.getResourceAsStream("/org/tutorialexception/mensajes.properties"));
String saludo = info.getProperty("saludo");
String sujeto = info.getProperty("sujeto");
System.out.println(saludo + " " + sujeto);
} catch (IOException ex) {
System.out.println(ex);
}
}
}

Esta clase debe guardarse en el mismo sitio que el fichero de propiedades. Si ejecutamos tenemos que obtener la siguiente salida:
Hola amigo

Si cambiamos los valores de 'saludo' y 'sujeto' por

#Mensajes
saludo=Hi
sujeto=friend

y volvemos a ejecutar (sin compilar) la clase Main veremos que el resultado cambia:
Hi friend

Nota 1: Puede verse que la llamada a getResourceAsStream se a hecho especificando la ruta completa del paquete empezando por '/' (ruta absoluta). Si consultamos la API del método podemos ver que si la ruta empieza por la barra ('/') la ruta se trata como absoluta y tenemos que poner todo el paquete. Si por el contrario no ponemos la barra, se trata como ruta relativa a partir de la clase. Por este motivo, puesto que el fichero de propiedades está situado en el mismo paquete que la clase Main, podríamos haber escrito:

info.load(Main.class
.getResourceAsStream("mensajes.properties"));


Nota 2: La llamada a info.getProperty puede hacerse pasando un segundo argumento adicional que representa un valor por defecto en el caso de no encontrar la clave especificada. Esto puede llegar a resultar muy útil sobre todo cuando existen multitud de claves, ya que puede darse el caso de que nos olvidemos escribir alguna. En nuestro ejemplo podríamos haber escrito:

String saludo = info.getProperty("saludo", "Hola");
String sujeto = info.getProperty("sujeto", "humano");

Con estas dos observaciones, nuestro programa mejorado quedaría:

package org.tutorialexception;

import java.io.IOException;
import java.util.Properties;

public class Main {
public static void main(String[] args) {
Properties info  = new Properties();
try {
info.load(Main.class.getResourceAsStream( "mensajes.properties" ));
String saludo = info.getProperty("saludo", "Hola");
String sujeto = info.getProperty("sujeto", "humano");
System.out.println(saludo + " " + sujeto);
} catch (IOException ex) {
System.out.println(ex);
}
}
}

1 comentarios:

Parov Hefe dijo...

Si estas interesado en traducir archivos .properties, yo recomiendo altamente esta rápida y intuitiva herramienta en línea para la localización de software: https://poeditor.com/

Publicar un comentario