Introduzione alle proprietà Java

1. Panoramica

La maggior parte delle applicazioni Java a un certo punto necessita di utilizzare le proprietà, generalmente per memorizzare parametri semplici come coppie chiave-valore, al di fuori del codice compilato.

E così il linguaggio ha un supporto di prima classe per le proprietà - java.util.Properties - una classe di utilità progettata per gestire questo tipo di file di configurazione.

Questo è ciò su cui ci concentreremo in questo articolo.

2. Caricamento delle proprietà

2.1. Dai file delle proprietà

Cominciamo con un esempio per il caricamento di coppie chiave-valore dai file delle proprietà; stiamo caricando due file che abbiamo a disposizione sul nostro classpath:

app.properties:

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

E catalogo :

c1=files c2=images c3=videos

Si noti che sebbene si consiglia ai file delle proprietà di utilizzare " .properties ", il suffisso, non è necessario.

Ora possiamo caricarli molto semplicemente in un'istanza di Properties :

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"));

Finché il contenuto di un file soddisfa i requisiti di formato del file delle proprietà, può essere analizzato correttamente dalla classe Properties . Di seguito sono disponibili ulteriori dettagli per il formato del file delle proprietà.

2.2. Carica da file XML

Oltre ai file delle proprietà, la classe Properties può anche caricare file XML conformi alle specifiche DTD specifiche.

Di seguito è riportato un esempio per il caricamento di coppie chiave-valore da un file XML - icons.xml :

   xml example icon1.jpg icon2.jpg icon3.jpg 

Adesso carichiamolo:

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. Ottieni proprietà

Possiamo usare getProperty (String key) e getProperty (String key, String defaultValue) per ottenere il valore dalla sua chiave.

Se la coppia chiave-valore esiste, i due metodi restituiranno entrambi il valore corrispondente. Ma se non esiste una tale coppia chiave-valore, la prima restituirà null e la seconda restituirà invece defaultValue .

Codice di esempio:

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);

Nota che sebbene la classe Properties erediti il metodo get () dalla classe Hashtable , non ti consiglierei di usarlo per ottenere valore. Perché il suo metodo get () restituirà un valore Object che può essere cast solo su String e il metodo getProperty () gestisce già il valore grezzo Object correttamente per te.

Il codice seguente genererà un'eccezione :

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

4. Imposta proprietà

Possiamo utilizzare il metodo setProperty () per aggiornare una coppia chiave-valore esistente o aggiungere una nuova coppia chiave-valore.

Codice di esempio:

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);

Nota che sebbene la classe Properties erediti il metodo put () e il metodo putAll () dalla classe Hashtable , non consiglierei di usarli per lo stesso motivo del metodo get () : solo i valori String possono essere usati in Properties .

Il codice seguente non funzionerà come desideri, quando usi getProperty () per ottenere il suo valore, restituirà null :

appProps.put("version", 2);

5. Rimuovi proprietà

Se desideri rimuovere una coppia chiave-valore, puoi utilizzare il metodo remove () .

Codice di esempio:

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

6. Store

6.1. Archivia nei file delle proprietà

La classe Properties fornisce un metodo store () per produrre coppie chiave-valore.

Codice di esempio:

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.

Tuttavia, durante la lettura di un file XML codificato in modo diverso, possiamo specificarlo nella dichiarazione DOCTYPE ; anche la scrittura è abbastanza flessibile: possiamo specificare la codifica in un terzo parametro dell'API storeToXML () .

10. Conclusione

In questo articolo, abbiamo discusso l' utilizzo di base della classe Properties , incluso come utilizzare Properties caricare e memorizzare coppie chiave-valore in entrambe le proprietà e nel formato XML, come utilizzare coppie chiave-valore in un oggetto Properties , come recuperare valori, aggiornare valori , ottenere le sue dimensioni e come utilizzare un elenco predefinito per un oggetto Properties .

Il codice sorgente completo per l'esempio è disponibile in questo progetto GitHub.