Introducción a las propiedades de Java

1. Información general

La mayoría de las aplicaciones Java necesitan usar propiedades en algún momento, generalmente para almacenar parámetros simples como pares clave-valor, fuera del código compilado.

Y así, el lenguaje tiene soporte de primera clase para propiedades, java.util.Properties , una clase de utilidad diseñada para manejar este tipo de archivos de configuración.

Eso es en lo que nos centraremos en este artículo.

2. Cargando propiedades

2.1. Desde archivos de propiedades

Comencemos con un ejemplo para cargar pares clave-valor desde archivos de propiedades; estamos cargando dos archivos que tenemos disponibles en nuestro classpath:

propiedades de la aplicación:

version=1.0 name=TestApp date=2016-11-12

Y catalogar :

c1=files c2=images c3=videos

Tenga en cuenta que, aunque se recomienda que los archivos de propiedades utilicen " .properties ", el sufijo, no es necesario.

Ahora podemos cargarlos de manera muy simple en una instancia de Propiedades :

String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); String appConfigPath = rootPath + "app.properties"; String catalogConfigPath = rootPath + "catalog"; Properties appProps = new Properties(); appProps.load(new FileInputStream(appConfigPath)); Properties catalogProps = new Properties(); catalogProps.load(new FileInputStream(catalogConfigPath)); String appVersion = appProps.getProperty("version"); assertEquals("1.0", appVersion); assertEquals("files", catalogProps.getProperty("c1"));

Siempre que el contenido de un archivo cumpla con los requisitos de formato de archivo de propiedades, la clase Propiedades lo puede analizar correctamente . Aquí hay más detalles sobre el formato de archivo de propiedad.

2.2. Cargar desde archivos XML

Además de los archivos de propiedades, la clase Propiedades también puede cargar archivos XML que se ajustan a las especificaciones DTD específicas.

A continuación, se muestra un ejemplo para cargar pares clave-valor desde un archivo XML: icons.xml :

   xml example icon1.jpg icon2.jpg icon3.jpg 

Ahora, cargámoslo:

String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); String iconConfigPath = rootPath + "icons.xml"; Properties iconProps = new Properties(); iconProps.loadFromXML(new FileInputStream(iconConfigPath)); assertEquals("icon1.jpg", iconProps.getProperty("fileIcon"));

3. Obtener propiedades

Podemos usar getProperty (String key) y getProperty (String key, String defaultValue) para obtener valor por su clave.

Si existe el par clave-valor, los dos métodos devolverán el valor correspondiente. Pero si no existe tal par clave-valor, el primero devolverá nulo y el segundo devolverá defaultValue .

Código de ejemplo:

String appVersion = appProps.getProperty("version"); String appName = appProps.getProperty("name", "defaultName"); String appGroup = appProps.getProperty("group", "baeldung"); String appDownloadAddr = appProps.getProperty("downloadAddr"); assertEquals("1.0", appVersion); assertEquals("TestApp", appName); assertEquals("baeldung", appGroup); assertNull(appDownloadAddr);

Tenga en cuenta que aunque la clase Properties hereda el método get () de la clase Hashtable , no le recomendaría que lo use para obtener valor. Debido a que su método get () devolverá un valor de Objeto que solo se puede convertir a String y el método getProperty () ya maneja el valor de Objeto sin procesar correctamente por usted.

El siguiente código arrojará una excepción :

float appVerFloat = (float) appProps.get("version");

4. Establecer propiedades

Podemos usar el método setProperty () para actualizar un par clave-valor existente o agregar un nuevo par clave-valor.

Código de ejemplo:

appProps.setProperty("name", "NewAppName"); // update an old value appProps.setProperty("downloadAddr", "www.baeldung.com/downloads"); // add new key-value pair String newAppName = appProps.getProperty("name"); assertEquals("NewAppName", newAppName); String newAppDownloadAddr = appProps.getProperty("downloadAddr"); assertEquals("www.baeldung.com/downloads", newAppDownloadAddr);

Tenga en cuenta que aunque la clase Properties hereda el método put () y el método putAll () de la clase Hashtable , no recomendaría que los use por la misma razón que para el método get () : solo se pueden usar valores String en Propiedades .

El siguiente código no funcionará como desea, cuando use getProperty () para obtener su valor, devolverá nulo :

appProps.put("version", 2);

5. Eliminar propiedades

Si desea eliminar un par clave-valor, puede usar el método remove () .

Código de ejemplo:

String versionBeforeRemoval = appProps.getProperty("version"); assertEquals("1.0", versionBeforeRemoval); appProps.remove("version"); String versionAfterRemoval = appProps.getProperty("version"); assertNull(versionAfterRemoval);

6. Tienda

6.1. Almacenar en archivos de propiedades

La clase de propiedades proporciona un método store () para generar pares clave-valor.

Código de ejemplo:

String newAppConfigPropertiesFile = rootPath + "newApp.properties"; appProps.store(new FileWriter(newAppConfigPropertiesFile), "store to properties file");

The second parameter is for comment. If you don't want to write any comment, simply use null for it.

6.2. Store to XML Files

Properties class also provides a storeToXML() method to output key-value pairs in XML format.

Example code:

String newAppConfigXmlFile = rootPath + "newApp.xml"; appProps.storeToXML(new FileOutputStream(newAppConfigXmlFile), "store to xml file");

The second parameter is as same as it in the store() method.

7. Other Common Operations

Properties class also provides some other methods to operate the properties.

Example code:

appProps.list(System.out); // list all key-value pairs Enumeration valueEnumeration = appProps.elements(); while (valueEnumeration.hasMoreElements()) { System.out.println(valueEnumeration.nextElement()); } Enumeration keyEnumeration = appProps.keys(); while (keyEnumeration.hasMoreElements()) { System.out.println(keyEnumeration.nextElement()); } int size = appProps.size(); assertEquals(3, size);

8. Default Property List

A Properties object can contain another Properties object as its default property list. The default property list will be searched if the property key is not found in the original one.

Besides “app.properties“, we have another file – “default.properties” – on our classpath:

default.properties:

site=www.google.com name=DefaultAppName topic=Properties category=core-java

Example Code:

String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); String defaultConfigPath = rootPath + "default.properties"; Properties defaultProps = new Properties(); defaultProps.load(new FileInputStream(defaultConfigPath)); String appConfigPath = rootPath + "app.properties"; Properties appProps = new Properties(defaultProps); appProps.load(new FileInputStream(appConfigPath)); assertEquals("1.0", appVersion); assertEquals("TestApp", appName); assertEquals("www.google.com", defaultSite);

9. Properties and Encoding

By default, properties files are expected to be ISO-8859-1 (Latin-1) encoded, so properties with characters outside of the ISO-8859-1 shouldn't generally be used.

We can work around that limitation with the help of tools such as the JDK native2ascii tool or explicit encodings on files, if necessary.

For XML files, the loadFromXML() method and the storeToXML() method use UTF-8 character encoding by default.

Sin embargo, al leer un archivo XML codificado de manera diferente, podemos especificarlo en la declaración DOCTYPE ; la escritura también es lo suficientemente flexible: podemos especificar la codificación en un tercer parámetro de la API storeToXML () .

10. Conclusión

En este artículo, hemos analizado el uso básico de la clase de Propiedades , incluido cómo usar la carga de Propiedades y almacenar pares clave-valor tanto en propiedades como en formato XML, cómo operar pares clave-valor en un objeto Propiedades , como recuperar valores, actualizar valores , obtenga su tamaño y cómo usar una lista predeterminada para un objeto Propiedades .

El código fuente completo del ejemplo está disponible en este proyecto de GitHub.