Komme i gang med Java Properties

1. Oversikt

De fleste Java-applikasjoner må bruke egenskaper på et tidspunkt, vanligvis for å lagre enkle parametere som nøkkelverdipar, utenfor kompilert kode.

Og så har språket førsteklasses støtte for eiendommer - java.util.Eiendommer - en verktøysklasse designet for håndtering av denne typen konfigurasjonsfiler.

Det er det vi vil fokusere på i denne artikkelen.

2. Laster egenskaper

2.1. Fra Egenskapsfiler

La oss starte med et eksempel for å laste nøkkelverdipar fra egenskapsfiler; vi laster inn to filer vi har tilgjengelig på klassestien vår:

app.properties:

versjon = 1.0 navn = TestApp dato = 2016-11-12

Og katalog:

c1 = filer c2 = bilder c3 = videoer

Legg merke til at selv om eiendomsfilene anbefales å bruke “.eiendommer“, Suffikset, det er ikke nødvendig.

Vi kan nå laste dem veldig enkelt inn i en Eiendommer forekomst:

String rootPath = Thread.currentThread (). GetContextClassLoader (). GetResource (""). GetPath (); String appConfigPath = rootPath + "app.properties"; StrengkatalogConfigPath = rootPath + "katalog"; Egenskaper appProps = nye egenskaper (); appProps.load (ny FileInputStream (appConfigPath)); Properties catalogProps = nye egenskaper (); catalogProps.load (ny FileInputStream (catalogConfigPath)); String appVersion = appProps.getProperty ("versjon"); assertEquals ("1.0", appVersion); assertEquals ("filer", catalogProps.getProperty ("c1"));

Så lenge en fils innhold oppfyller kravene til filformategenskaper, kan den analyseres riktig av Eiendommer klasse. Her er mer informasjon om eiendomsfilformat.

2.2. Last fra XML-filer

Foruten eiendomsfiler, Eiendommer klasse kan også laste inn XML-filer som samsvarer med de spesifikke DTD-spesifikasjonene.

Her er et eksempel for å laste nøkkelverdipar fra en XML-fil - ikoner.xml:

   xml eksempel ikon1.jpg ikon2.jpg ikon3.jpg 

La oss nå laste det inn:

String rootPath = Thread.currentThread (). GetContextClassLoader (). GetResource (""). GetPath (); Streng iconConfigPath = rootPath + "ikoner.xml"; Egenskaper iconProps = nye egenskaper (); iconProps.loadFromXML (ny FileInputStream (iconConfigPath)); assertEquals ("icon1.jpg", iconProps.getProperty ("fileIcon"));

3. Få eiendommer

Vi kan bruke getProperty (strengnøkkel) og getProperty (strengnøkkel, streng standardverdi) for å få verdi av nøkkelen.

Hvis nøkkelverdiparet eksisterer, returnerer de to metodene den tilsvarende verdien. Men hvis det ikke er noe slikt nøkkelverdi-par, vil førstnevnte returnere null, og sistnevnte vil returnere standardverdi i stedet.

Eksempel kode:

String appVersion = appProps.getProperty ("versjon"); String appName = appProps.getProperty ("navn", "standardnavn"); String appGroup = appProps.getProperty ("gruppe", "baeldung"); String appDownloadAddr = appProps.getProperty ("downloadAddr"); assertEquals ("1.0", appVersion); assertEquals ("TestApp", appName); assertEquals ("baeldung", appGroup); assertNull (appDownloadAddr);

Merk at selv om Eiendommer klasse arver få() metode fra Hashtable klasse, vil jeg ikke anbefale deg å bruke den for å få verdi. Fordi det er få() metoden vil returnere en Gjenstand verdi som bare kan kastes til String og getProperty () metoden allerede håndterer rå Gjenstand verdi riktig for deg.

Koden nedenfor vil kaste et Unntak:

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

4. Angi egenskaper

Vi kan bruke setProperty () metode for å oppdatere et eksisterende nøkkelverdipar eller legge til et nytt nøkkelverdipar.

Eksempel kode:

appProps.setProperty ("navn", "NewAppName"); // oppdater en gammel verdi appProps.setProperty ("downloadAddr", "www.baeldung.com/downloads"); // legg til nytt nøkkelverdipar String newAppName = appProps.getProperty ("navn"); assertEquals ("NewAppName", newAppName); Streng newAppDownloadAddr = appProps.getProperty ("downloadAddr"); assertEquals ("www.baeldung.com/downloads", newAppDownloadAddr);

Merk at selv om Eiendommer klasse arver sette() metode og putt alle() metode fra Hashtable klasse, vil jeg ikke anbefale deg å bruke dem av samme grunn som for få() metode: bare String verdier kan brukes i Eiendommer.

Koden nedenfor fungerer ikke som du vil når du bruker den getProperty () for å få verdien, kommer den tilbake null:

appProps.put ("versjon", 2);

5. Fjern egenskaper

Hvis du vil fjerne et nøkkelverdipar, kan du bruke fjerne() metode.

Eksempel kode:

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

6. Oppbevar

6.1. Lagre til Egenskapsfiler

Eiendommer klasse gir en butikk() metode for å sende ut nøkkelverdipar.

Eksempel kode:

Streng newAppConfigPropertiesFile = rootPath + "newApp.properties"; appProps.store (ny FileWriter (newAppConfigPropertiesFile), "lagre til egenskaper-fil");

Den andre parameteren er for kommentar. Hvis du ikke vil skrive noen kommentar, kan du bare bruke null til det.

6.2. Lagre til XML-filer

Eiendommer klasse gir også en storeToXML () metode for å sende nøkkelverdipar i XML-format.

Eksempel kode:

Streng newAppConfigXmlFile = rootPath + "newApp.xml"; appProps.storeToXML (ny FileOutputStream (newAppConfigXmlFile), "lagre til xml-fil");

Den andre parameteren er den samme som den i butikk() metode.

7. Andre vanlige operasjoner

Eiendommer klasse gir også noen andre metoder for å betjene egenskapene.

Eksempel kode:

appProps.list (System.out); // liste opp alle nøkkelverdiparene Enumeration valueEnumeration = appProps.elements (); mens (valueEnumeration.hasMoreElements ()) {System.out.println (valueEnumeration.nextElement ()); } Opptelling keyEnumeration = appProps.keys (); while (keyEnumeration.hasMoreElements ()) {System.out.println (keyEnumeration.nextElement ()); } int størrelse = appProps.size (); assertEquals (3, størrelse);

8. Standard liste over eiendommer

EN Eiendommer objekt kan inneholde et annet Eiendommer objekt som standard eiendomsliste. Standardegenskapelisten vil bli søkt hvis eiendomsnøkkelen ikke finnes i den opprinnelige.

Foruten “app.properties“, Vi har en annen fil -“standard.egenskaper”- på klassestien vår:

default.properties:

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

Eksempel kode:

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

9. Egenskaper og koding

Som standard forventes eiendomsfilene å være ISO-8859-1 (Latin-1) kodet, så egenskaper med tegn utenfor ISO-8859-1 skal generelt ikke brukes.

Vi kan omgå den begrensningen ved hjelp av verktøy som JDK native2ascii-verktøyet eller eksplisitte kodinger på filer, om nødvendig.

For XML-filer, loadFromXML () metoden og storeToXML () metode bruker UTF-8 tegnkoding som standard.

Når vi leser en XML-fil kodet annerledes, kan vi imidlertid spesifisere det i DOKTYPE erklæring; skriving er også fleksibel nok - vi kan spesifisere kodingen i en tredje parameter for storeToXML () API.

10. Konklusjon

I denne artikkelen har vi diskutert grunnleggende Eiendommer klassebruk, inkludert hvordan du bruker Eiendommer last og lagre nøkkelverdipar i begge egenskaper og XML-format, hvordan du bruker nøkkelverdipar i en Eiendommer objekt, for eksempel hente verdier, oppdatere verdier, få størrelsen og hvordan du bruker en standardliste for en Eiendommer gjenstand.

Den komplette kildekoden for eksemplet er tilgjengelig i dette GitHub-prosjektet.


$config[zx-auto] not found$config[zx-overlay] not found