Kom godt i gang med Java Properties

1. Oversigt

De fleste Java-applikationer skal bruge egenskaber på et eller andet tidspunkt, generelt for at gemme enkle parametre som nøgleværdipar uden for den kompilerede kode.

Og så har sproget førsteklasses support til ejendomme - java.util.Ejendomme - en hjælpeklasse designet til håndtering af denne type konfigurationsfiler.

Det er det, vi vil fokusere på i denne artikel.

2. Indlæsningsegenskaber

2.1. Fra egenskabsfiler

Lad os starte med et eksempel til indlæsning af nøgleværdipar fra egenskabsfiler; vi indlæser to filer, vi har tilgængelige på vores klassesti:

app.properties:

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

Og katalog:

c1 = filer c2 = billeder c3 = videoer

Bemærk, at selvom egenskabsfilerne anbefales at bruge “.ejendomme“, Suffikset, det er ikke nødvendigt.

Vi kan nu indlæse dem meget enkelt i en Ejendomme eksempel:

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

Så længe en fils indhold opfylder egenskabernes filformatkrav, kan den parses korrekt af Ejendomme klasse. Her er flere detaljer om egenskabsfilformat.

2.2. Indlæs fra XML-filer

Udover egenskabsfiler, Ejendomme klasse kan også indlæse XML-filer, der overholder de specifikke DTD-specifikationer.

Her er et eksempel på indlæsning af nøgleværdipar fra en XML-fil - ikoner.xml:

   xml eksempel ikon1.jpg ikon2.jpg ikon3.jpg 

Lad os nu indlæse det:

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

3. Få ejendomme

Vi kan bruge getProperty (strengnøgle) og getProperty (strengnøgle, streng standardværdi) for at få værdi ved nøglen.

Hvis der findes nøgleværdipar, returnerer de to metoder begge den tilsvarende værdi. Men hvis der ikke er et sådant nøgleværdipar, returnerer førstnævnte nul, og sidstnævnte vender tilbage standard værdi i stedet.

Eksempel kode:

String appVersion = appProps.getProperty ("version"); 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);

Bemærk, at selvom Ejendomme klasse arver få() metode fra Hashtable klasse, vil jeg ikke anbefale, at du bruger den til at få værdi. Fordi det er få() metode returnerer en Objekt værdi, som kun kan kastes til Snor og getProperty () metoden allerede håndterer rå Objekt værdi korrekt for dig.

Koden nedenfor kaster en Undtagelse:

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

4. Indstil egenskaber

Vi kan bruge setProperty () metode til at opdatere et eksisterende nøgleværdipar eller tilføje et nyt nøgleværdipar.

Eksempel kode:

appProps.setProperty ("navn", "NewAppName"); // opdater en gammel værdi appProps.setProperty ("downloadAddr", "www.baeldung.com/downloads"); // tilføj nyt nøgleværdipar String newAppName = appProps.getProperty ("name"); assertEquals ("NewAppName", newAppName); Streng newAppDownloadAddr = appProps.getProperty ("downloadAddr"); assertEquals ("www.baeldung.com/downloads", newAppDownloadAddr);

Bemærk, at selvom Ejendomme klasse arver sætte() metode og putAll () metode fra Hashtable klasse, vil jeg ikke anbefale, at du bruger dem af samme grund som til få() metode: kun Snor værdier kan bruges i Ejendomme.

Koden nedenfor fungerer ikke som du ønsker, når du bruger getProperty () for at få sin værdi vender den tilbage nul:

appProps.put ("version", 2);

5. Fjern egenskaber

Hvis du vil fjerne et nøgleværdipar, kan du bruge fjerne() metode.

Eksempel kode:

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

6. Opbevar

6.1. Gem til egenskabsfiler

Ejendomme klasse giver en butik() metode til output af nøgleværdipar.

Eksempel kode:

Streng newAppConfigPropertiesFile = rootPath + "newApp.properties"; appProps.store (ny FileWriter (newAppConfigPropertiesFile), "butik til egenskabsfil");

Den anden parameter er til kommentar. Hvis du ikke vil skrive nogen kommentar, skal du blot bruge null til det.

6.2. Gem til XML-filer

Ejendomme klasse giver også en storeToXML () metode til output af nøgleværdipar i XML-format.

Eksempel kode:

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

Den anden parameter er den samme som den i butik() metode.

7. Andre almindelige operationer

Ejendomme klasse giver også nogle andre metoder til at betjene egenskaberne.

Eksempel kode:

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

8. Standard ejendomsliste

EN Ejendomme objekt kan indeholde et andet Ejendomme objekt som sin standardegenskabsliste. Der søges i standardegenskabslisten, hvis ejendomsnøglen ikke findes i den oprindelige.

Udover “app.egenskaber“, Vi har en anden fil -“standard.egenskaber”- på vores klassesti:

standard.egenskaber:

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

Eksempel kode:

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

9. Egenskaber og kodning

Som standard forventes egenskabsfiler at være ISO-8859-1 (Latin-1) kodet, så egenskaber med tegn uden for ISO-8859-1 bør generelt ikke bruges.

Vi kan omgå denne begrænsning ved hjælp af værktøjer som JDK native2ascii-værktøjet eller eksplicit kodning på filer, hvis det er nødvendigt.

For XML-filer skal loadFromXML () metode og storeToXML () metode bruger UTF-8 tegnkodning som standard.

Når vi læser en XML-fil kodet forskelligt, kan vi dog specificere det i DOCTYPE erklæring; skrivning er også fleksibel nok - vi kan specificere kodningen i en tredje parameter af storeToXML () API.

10. Konklusion

I denne artikel har vi diskuteret grundlæggende Ejendomme klassebrug, herunder hvordan man bruger Ejendomme indlæse og gemme nøgleværdipar i begge egenskaber og XML-format, hvordan man bruger nøgleværdipar i en Ejendomme objekt, f.eks. hente værdier, opdatere værdier, få dens størrelse, og hvordan man bruger en standardliste til en Ejendomme objekt.

Den komplette kildekode til eksemplet er tilgængelig i dette GitHub-projekt.