1. Gambaran keseluruhan
Sebilangan besar aplikasi Java perlu menggunakan sifat pada suatu ketika, umumnya untuk menyimpan parameter sederhana sebagai pasangan nilai-kunci, di luar kod yang disusun.
Oleh itu, bahasa mempunyai sokongan kelas pertama untuk sifat - java.util.Properties - kelas utiliti yang direka untuk mengendalikan jenis fail konfigurasi ini.
Itulah yang akan kami fokuskan dalam artikel ini.
2. Memuatkan Properties
2.1. Dari Fail Properties
Mari kita mulakan dengan contoh untuk memuatkan pasangan nilai-kunci dari fail sifat; kami memuatkan dua fail yang kami ada di classpath kami:
app.properties:
version=1.0 name=TestApp date=2016-11-12
Dan katalog :
c1=files c2=images c3=videos
Perhatikan bahawa walaupun fail sifat disarankan untuk menggunakan " .properties ", akhiran, itu tidak perlu.
Kita sekarang boleh memuatkannya dengan mudah ke dalam contoh 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"));
Selagi kandungan fail memenuhi syarat format fail sifat, fail dapat dihuraikan dengan betul oleh kelas Properties . Berikut adalah lebih banyak maklumat untuk format fail Properti.
2.2. Muat Dari Fail XML
Selain fail sifat, kelas Properties juga dapat memuat file XML yang sesuai dengan spesifikasi DTD tertentu.
Berikut adalah contoh untuk memuatkan pasangan nilai-kunci dari fail XML - icons.xml :
xml example icon1.jpg icon2.jpg icon3.jpg
Sekarang, mari kita muatkan:
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. Dapatkan Hartanah
Kita boleh menggunakan getProperty (kunci String) dan getProperty (kekunci String, String defaultValue) untuk mendapatkan nilai dengan kuncinya.
Sekiranya pasangan kunci-nilai ada, kedua-dua kaedah akan mengembalikan nilai yang sepadan. Tetapi jika tidak ada pasangan nilai-kunci seperti itu, yang pertama akan kembali nol, dan yang kedua akan mengembalikan nilai default .
Contoh kod:
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);
Perhatikan bahawa walaupun Properties mewarisi kelas mendapatkan () kaedah dari Hashtable kelas, saya tidak akan mengesyorkan anda menggunakannya untuk mendapatkan nilai. Kerana kaedah get () akan mengembalikan nilai Objek yang hanya dapat dilemparkan ke String dan kaedah getProperty () sudah menangani nilai Objek mentah dengan tepat untuk anda.
Kod di bawah akan memberikan Pengecualian :
float appVerFloat = (float) appProps.get("version");
4. Tetapkan Sifat
Kita dapat menggunakan metode setProperty () untuk mengemas kini pasangan nilai kunci yang ada atau menambahkan pasangan nilai kunci baru.
Contoh kod:
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);
Perhatikan bahawa walaupun kelas Properties mewarisi kaedah put () dan kaedah putAll () dari kelas Hashtable , saya tidak akan mengesyorkan anda menggunakannya untuk alasan yang sama seperti kaedah get () : hanya nilai String yang dapat digunakan dalam Properties .
Kod di bawah tidak akan berfungsi seperti yang anda mahukan, apabila anda menggunakan getProperty () untuk mendapatkan nilainya, ia akan dikembalikan nol :
appProps.put("version", 2);
5. Keluarkan Sifat
Sekiranya anda ingin membuang pasangan nilai-kunci, anda boleh menggunakan kaedah hapus () .
Contoh Kod:
String versionBeforeRemoval = appProps.getProperty("version"); assertEquals("1.0", versionBeforeRemoval); appProps.remove("version"); String versionAfterRemoval = appProps.getProperty("version"); assertNull(versionAfterRemoval);
6. Simpan
6.1. Simpan ke Fail Properties
Kelas Properties menyediakan kaedah store () untuk mengeluarkan pasangan nilai-kunci.
Contoh kod:
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.
Walau bagaimanapun, apabila membaca fail XML yang dikodkan secara berbeza, kita dapat menentukannya dalam deklarasi DOCTYPE ; penulisan juga cukup fleksibel - kita dapat menentukan pengekodan dalam parameter ketiga API storeToXML () .
10. Kesimpulannya
Dalam artikel ini, kami telah membincangkan penggunaan kelas Properties asas , termasuk cara menggunakan Properties memuat dan menyimpan pasangan nilai-kunci dalam kedua-dua sifat dan format XML, cara mengoperasikan pasangan nilai-kunci dalam objek Properties , seperti mengambil nilai, mengemas kini nilai , dapatkan ukurannya, dan cara menggunakan senarai lalai untuk objek Properties .
Kod sumber lengkap untuk contoh boleh didapati dalam projek GitHub ini.