Las propiedades son una utilidad que vienen a sustituir el concepto de variables de entorno. Podemos utilizarlas para añadir información adicional a nuestras clases.
La clase Properties es una implementación de Map por lo cual todos sus elementos se componen de clave-valor ambos de tipo String.
Esta clase expone los siguientes métodos útiles:
- propertyNames; devuelve un Enumeration con todos los nombres de las propiedades.
- getProperty; este método recibe el nombre de la propiedad y devuelve el valor asociada a esta como un String
El método System.getProperties devuelve una instancia de tipo Properties
Podemos utilizar la opción -D para incluir nuevas propiedades.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import java.util.Properties; public class Main { public static void main(String[] args) { Properties props = System.getProperties(); props.list(System.out); String autor = props.getProperty("autor"); System.out.println("El autor es " + autor); } } |
Para entender mejor la utilidad de este objeto, vamos un ejemplo de uso.
Supongamos que tenemos que parametrizar el acceso a una base de datos usando Java . Normalmente nos encontraremos con un código Java similar a este:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package com.arquitecturajava; public class Principal { public static void main(String[] args) { final String DRIVER = "com.mysql.jdbc.Driver"; final String URL = "jdbc:mysql://localhost/mibasedatos"; final String USUARIO = "pepe"; final String CLAVE = "pepe"; System.out.println(DRIVER); System.out.println(URL); System.out.println(USUARIO); System.out.println(CLAVE); } } |
Es evidente que no queremos tener integrado en el código la cadena de conexion , el driver usuario y password . Sino que preferiremos tenerlo en un fichero aparte de tal forma que podamos cambiar a voluntad la base de datos de destino y el usuario que se conecta. Para solventar este problema disponemos de los ficheros de propiedades. Los ficheros de propiedades disponen de una pareja clave valor por linea en la cual se definen las diferentes propiedades.
En un archivo de texto, ponemos los datos.
|
1 2 3 4 |
DRIVER=com.mysql.jdbc.Driver jdbc=mysql://localhost/mibasedatos USUARIO=pepe CLAVE=pepe |
Una vez que tenemos el fichero de propiedades , el siguiente paso es construir el código que nos lea los valores que están almacenados en él.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package com.arquitecturajava; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Properties; public class Principal { public static void main(String[] args) { Properties properties= new Properties(); try { properties.load(new FileInputStream(new File("configuracion.properties"))); System.out.println(properties.get("DRIVER")); System.out.println(properties.get("URL")); System.out.println(properties.get("USUARIO")); System.out.println(properties.get("CLAVE")); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
Solamente que ahora hemos conseguido externalizar las propiedades y que no haga falta recompilar el programa para que funcione. El manejo de properties siempre ha sido algo bastante flexible y permite gestionar de forma directa ficheros XML.
|
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="DRIVER">com.mysql.jdbc.Driver</entry> <entry key="URL">jdbc:mysql://localhost/mibasedatos</entry> <entry key="USUARIO">pepe</entry> <entry key="CLAVE">pepe</entry> </properties> |
En este caso la estructura es algo más compleja . Evidentemente tendremos que actualizar nuestro código de Java para leer los datos de este nuevo tipo de fichero . En esta situación todo es sencillo ya que simplemente basta con cambiar un método.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package com.arquitecturajava; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Properties; public class Principal2 { public static void main(String[] args) { Properties properties= new Properties(); try { properties.load(new FileInputStream(new File("configuracion.properties"))); System.out.println(properties.get("DRIVER")); System.out.println(properties.get("URL")); System.out.println(properties.get("USUARIO")); System.out.println(properties.get("CLAVE")); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |