Leer y modificar fichero de propiedades en java

De ChuWiki

En java es habitual guardar algunos parámetros de configuración de nuestro programa en fichero de propiedades. Un fichero de propiedades no es más que un fichero de texto, habitualmente con la extensión .properties, que en cada línea tiene una pareja clave=valor. Algo como esto

# Esto es un comentario
path=c:/un/path
username=Pedro Arenas
password=un secreto

Cada clave representa un parámetro de configuración de nuestro programa y el valor es el valor para ese parámetro.

Java tiene soporte para leer fácilmente este fichero de propiedades. Veamos un par de ejemplos de cómo leerlo y de cómo modificarlo. Uno de los ejemplos uando el fichero de propiedades está en nuestro disco como un fichero normal, el otro cuando el fichero de propiedades está dentro de nuestro jar.

Tienes ambos ejemplos completos en Github

Fichero de propiedades en disco[editar]

Leer[editar]

Supongamos nuestro fichero de propiedades en el path files/properties/config.properties relativo al directorio donde se ejecuta nuestro programa Java. Su contenido puede ser algo como

uno=1
dos=2
tres=3

El siguiente código java lee este fichero de propiedades

Properties p = new Properties();
p.load(new FileReader("files/properties/config.properties"));

System.out.println("uno="+p.getProperty("uno"));

La clase Properties de java es la que permite leer el fichero y luego acceder a su contenido. El primer paso es obtener una instancia de esta clase sin más que hacer un new Properties().

Esta clase tiene un método load() que permite cargar el fichero. No tenemos más que pasarle un InputStream o un Reader de java. En este ejemplo le pasamos un Reder por medio de new FileReader("files/properties/config.properties").

Listo, si no salta ninguna excepción, por ejemplo, porque no hayamos puesto bien el path hacia nuestro fichero, la clase Properties ya tienes cargada todas las propiedades. Sólo tenemos que consultarlas

System.out.println("uno="+p.getProperty("uno"));

El método getProperty(String) nos permite, pasándole una clave, obtener el valor asociado a ella. En nuestro ejemplo, pasando como clave "uno", obtendriamos el valor asociado a ella "1" (siempre como String, aunque sea un número).

Si la clave no existe, obtendremos null como resultado. Sin embargo, tenemos una variante de getProperty() que permite obtener un valor por defecto en caso de que no exista la clave, como en el siguiente código

System.out.println("cuatro="+p.getProperty("cuatro", "default value"));

Al método getProperty() le pasamos como primer parámetro la clave cuyo valor queremos obtener, y como segundo parámetro el valor que queremos por defecto, en caso de que la clave no tenga valor asociado.

Leer todas[editar]

La clase Properties tiene varios métodos que nos permiten obtener todas las claves que hay en el fichero. Recorriendo estas claves, podemos obtener todos los valores. El siguiente código consulta todas las claves con el método keys() y luego realiza un bucle para ir sacando por pantalla todos los valores

Enumeration<Object> keys = p.keys();

while (keys.hasMoreElements()){
   Object key = keys.nextElement();
   System.out.println(key + " = "+ p.get(key));
}

Modificar[editar]

La clase Properties tiene un método setProperty() que nos permite añadir una pareja clave/valor nuevas, o bien modificar una ya existente.

p.setProperty("cuatro", "4");

Una vez que hemos modificado/añadido valores, podemos salvar el fichero. Para ello la clase Properties tiene dos métodos: save() y store(). Ambos métodos hacen lo mismo, pero save() está obsoleto, por lo que no se aconseja su uso. Para guardar los cambios, debemos llamar a store() pasándole un OutputStream o un Writer de java. En el siguiente trozo de código pasamos un Writer

p.store(new FileWriter("out.properties"),"un comentario");

El método store() admite un segundo parámetro que es un comentario que se añadirá como una línea de cabecera en el fichero. El resultado de esta llamada es un fichero con un contenido como el siguiente

#un comentario
#Fri Mar 11 18:39:52 CET 2016
dos=2
uno=1
tres=3
cuatro=4

Contiene el comentario que pusimos en la llamada a store(), la fecha que nos pone de regalo, y todas nuestras parejas clave/valor, sin ningún orden concreto.

Fichero de propiedades dentro del jar[editar]

Si el fichero de propiedades no está en el disco como un fichero normal, sino que está dentro de nuestro jar, sólo cambia la forma de leerlo. Si recuerdas, el método load() de la clase Properties admitía también un InputStream. A partir del ClassLoader de java podemos obtener un InputStream de un fichero que esté dentro del jar (o en el classpath de nuestro proyecto). El código para obtenerlo sería el siguiente

Properties p = new Properties();
InputStream propertiesStream = ClassLoader.getSystemResourceAsStream("properties/config.properties");
p.load(propertiesStream);
propertiesStream.close();

Con ClassLoader.getSystemResourceAsStream("properties/config.properties"); obtenemos el InputStream del fichero "config.properties" que está dentro del directorio "properties" que a su vez está dentro de nuestro jar (o en nuestro classpath). Una vez obtenido, sólo queda llamar a p.load(propertiesStream); y acordarnos de cerrar el InputStream

Listo, ya tenemos cargado el fichero de propiedades y podemos trabajar con él de la misma forma que en el caso anterior.