Leer y modificar fichero de propiedades en java
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.