Aan de slag met Java-eigenschappen

1. Overzicht

De meeste Java-toepassingen moeten op een bepaald moment eigenschappen gebruiken, meestal om eenvoudige parameters op te slaan als sleutel / waarde-paren, buiten de gecompileerde code.

En dus heeft de taal eersteklas ondersteuning voor eigenschappen - het java.util.Properties - een utility-klasse die is ontworpen voor het omgaan met dit type configuratiebestanden.

Dat is waar we ons in dit artikel op zullen concentreren.

2. Eigenschappen laden

2.1. Van eigenschappenbestanden

Laten we beginnen met een voorbeeld voor het laden van sleutel / waarde-paren uit eigenschappenbestanden; we laden twee bestanden die we beschikbaar hebben op ons klassenpad:

app.eigenschappen:

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

En catalogus:

c1 = bestanden c2 = afbeeldingen c3 = video's

Merk op dat hoewel het wordt aanbevolen om de eigenschappenbestanden te gebruiken ".eigendommen“, Het achtervoegsel, het is niet nodig.

We kunnen ze nu heel eenvoudig in een Eigendommen voorbeeld:

String rootPath = Thread.currentThread (). GetContextClassLoader (). GetResource (""). GetPath (); String appConfigPath = rootPath + "app.properties"; String catalogConfigPath = rootPath + "catalog"; Eigenschappen appProps = nieuwe Eigenschappen (); appProps.load (nieuwe FileInputStream (appConfigPath)); Eigenschappen catalogProps = nieuwe Eigenschappen (); catalogProps.load (nieuwe FileInputStream (catalogConfigPath)); String appVersion = appProps.getProperty ("versie"); assertEquals ("1.0", appVersion); assertEquals ("bestanden", catalogProps.getProperty ("c1"));

Zolang de inhoud van een bestand voldoet aan de vereisten voor de indeling van het bestand met eigenschappen, kan het correct worden geparseerd door Eigendommen klasse. Hier zijn meer details voor de indeling van het eigenschappenbestand.

2.2. Laden vanuit XML-bestanden

Naast eigenschappenbestanden, Eigendommen class kan ook XML-bestanden laden die voldoen aan de specifieke DTD-specificaties.

Hier is een voorbeeld voor het laden van sleutel / waarde-paren uit een XML-bestand - icons.xml:

   xml voorbeeld icon1.jpg icon2.jpg icon3.jpg 

Laten we het nu laden:

String rootPath = Thread.currentThread (). GetContextClassLoader (). GetResource (""). GetPath (); String iconConfigPath = rootPath + "icons.xml"; Eigenschappen iconProps = nieuwe Eigenschappen (); iconProps.loadFromXML (nieuwe FileInputStream (iconConfigPath)); assertEquals ("icon1.jpg", iconProps.getProperty ("fileIcon"));

3. Verkrijg Eigenschappen

We kunnen gebruiken getProperty (String-sleutel) en getProperty (String-sleutel, String defaultValue) om waarde te krijgen door zijn sleutel.

Als het sleutel / waarde-paar bestaat, retourneren de twee methoden beide de overeenkomstige waarde. Maar als er niet zo'n sleutel / waarde-paar is, zal het eerste nul retourneren en het laatste zal terugkeren standaardwaarde in plaats daarvan.

Voorbeeld code:

String appVersion = appProps.getProperty ("versie"); String appName = appProps.getProperty ("naam", "standaardnaam"); String appGroup = appProps.getProperty ("groep", "baeldung"); String appDownloadAddr = appProps.getProperty ("downloadAddr"); assertEquals ("1.0", appVersion); assertEquals ("TestApp", appName); assertEquals ("baeldung", appGroup); assertNull (appDownloadAddr);

Merk op dat hoewel Eigendommen klasse erft krijgen() methode van Hashtable klasse, zou ik je niet aanraden om het te gebruiken om waarde te krijgen. Omdat het is krijgen() methode retourneert een Voorwerp waarde die alleen kan worden gecast Draad en de getProperty () methode behandelt al de raw Voorwerp waarde goed voor u.

De onderstaande code zal een Uitzondering:

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

4. Eigenschappen instellen

We kunnen gebruiken setProperty () methode om een ​​bestaand sleutelwaardepaar bij te werken of om een ​​nieuw sleutelwaardepaar toe te voegen.

Voorbeeld code:

appProps.setProperty ("naam", "NewAppName"); // update een oude waarde appProps.setProperty ("downloadAddr", "www.baeldung.com/downloads"); // voeg een nieuw sleutel / waarde-paar toe String newAppName = appProps.getProperty ("naam"); assertEquals ("NewAppName", newAppName); String newAppDownloadAddr = appProps.getProperty ("downloadAddr"); assertEquals ("www.baeldung.com/downloads", newAppDownloadAddr);

Merk op dat hoewel Eigendommen klasse erft leggen() methode en zet alle() methode van Hashtable klasse, zou ik je niet aanraden om ze om dezelfde reden te gebruiken als voor krijgen() methode: alleen Draad waarden kunnen worden gebruikt in Eigendommen.

De onderstaande code werkt niet zoals u wilt, wanneer u gebruikt getProperty () om zijn waarde te krijgen, zal het terugkeren nul:

appProps.put ("versie", 2);

5. Eigenschappen verwijderen

Als u een sleutel / waarde-paar wilt verwijderen, kunt u verwijderen() methode.

Voorbeeldcode:

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

6. Opslaan

6.1. Opslaan in eigenschappenbestanden

Eigendommen klasse biedt een winkel() methode om sleutel / waarde-paren uit te voeren.

Voorbeeld code:

String newAppConfigPropertiesFile = rootPath + "newApp.properties"; appProps.store (nieuwe FileWriter (newAppConfigPropertiesFile), "opslaan in eigenschappenbestand");

De tweede parameter is voor commentaar. Als je geen commentaar wilt schrijven, gebruik er dan gewoon null voor.

6.2. Opslaan in XML-bestanden

Eigendommen klasse biedt ook een storeToXML () methode om sleutel-waardeparen in XML-indeling uit te voeren.

Voorbeeld code:

String newAppConfigXmlFile = rootPath + "newApp.xml"; appProps.storeToXML (nieuwe FileOutputStream (newAppConfigXmlFile), "opslaan in xml-bestand");

De tweede parameter is hetzelfde als in het winkel() methode.

7. Andere veel voorkomende handelingen

Eigendommen class biedt ook enkele andere methoden om de eigenschappen te bedienen.

Voorbeeld code:

appProps.list (System.out); // lijst alle sleutel / waarde-paren Opsomming valueEnumeration = appProps.elements (); while (valueEnumeration.hasMoreElements ()) {System.out.println (valueEnumeration.nextElement ()); } Opsomming keyEnumeration = appProps.keys (); while (keyEnumeration.hasMoreElements ()) {System.out.println (keyEnumeration.nextElement ()); } int size = appProps.size (); assertEquals (3, grootte);

8. Standaardeigenschappenlijst

EEN Eigendommen object kan een ander bevatten Eigendommen object als de standaard eigenschappenlijst. De standaard eigenschappenlijst wordt doorzocht als de eigenschapsleutel niet in de originele staat.

Naast 'app.eigenschappen", We hebben nog een bestand -"default.properties”- op ons klassenpad:

default.properties:

site = www.google.com name = DefaultAppName topic = Eigenschappen categorie = core-java

Voorbeeldcode:

String rootPath = Thread.currentThread (). GetContextClassLoader (). GetResource (""). GetPath (); String defaultConfigPath = rootPath + "default.properties"; Eigenschappen defaultProps = nieuwe Eigenschappen (); defaultProps.load (nieuwe FileInputStream (defaultConfigPath)); String appConfigPath = rootPath + "app.properties"; Eigenschappen appProps = nieuwe Eigenschappen (defaultProps); appProps.load (nieuwe FileInputStream (appConfigPath)); assertEquals ("1.0", appVersion); assertEquals ("TestApp", appName); assertEquals ("www.google.com", defaultSite);

9. Eigenschappen en codering

Standaard wordt verwacht dat eigenschappenbestanden ISO-8859-1 (Latin-1) gecodeerd zijn, dus eigenschappen met karakters buiten de ISO-8859-1 zouden over het algemeen niet gebruikt moeten worden.

We kunnen die beperking omzeilen met behulp van tools zoals de JDK native2ascii-tool of expliciete coderingen op bestanden, indien nodig.

Voor XML-bestanden is het loadFromXML () methode en de storeToXML () gebruik standaard UTF-8-tekencodering.

Bij het lezen van een XML-bestand dat anders gecodeerd is, kunnen we dat specificeren in de DOCTYPE verklaring; schrijven is ook flexibel genoeg - we kunnen de codering specificeren in een derde parameter van de storeToXML () API.

10. Conclusie

In dit artikel hebben we de basis besproken Eigendommen klasse gebruik, inclusief hoe te gebruiken Eigendommen sleutel-waardeparen laden en opslaan in zowel eigenschappen als XML-indeling, hoe sleutel-waardeparen in een Eigendommen object, zoals het ophalen van waarden, het bijwerken van waarden, het verkrijgen van de grootte en het gebruik van een standaardlijst voor een Eigendommen voorwerp.

De volledige broncode voor het voorbeeld is beschikbaar in dit GitHub-project.