Memulai dengan Properti Java

1. Ikhtisar

Sebagian besar aplikasi Java perlu menggunakan properti di beberapa titik, umumnya untuk menyimpan parameter sederhana sebagai key-value pair, di luar kode yang dikompilasi.

Dan bahasa tersebut memiliki dukungan kelas satu untuk properti - java.util.Properties - kelas utilitas yang dirancang untuk menangani jenis file konfigurasi ini.

Itulah yang akan kami fokuskan di artikel ini.

2. Memuat Properti

2.1. Dari File Properti

Mari kita mulai dengan contoh untuk memuat pasangan nilai-kunci dari file properti; kami memuat dua file yang kami miliki di classpath kami:

app.properties:

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

Dan katalog :

c1=files c2=images c3=videos

Perhatikan bahwa meskipun file properti direkomendasikan untuk menggunakan " .properties ", sufiks, itu tidak diperlukan.

Sekarang kita dapat memuatnya dengan sangat sederhana 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"));

Selama konten file memenuhi persyaratan format file properti, itu dapat diurai dengan benar oleh kelas Properti . Berikut adalah detail lebih lanjut untuk format file Properti.

2.2. Muat Dari File XML

Selain file properti, kelas Properties juga dapat memuat file XML yang sesuai dengan spesifikasi DTD tertentu.

Berikut adalah contoh untuk memuat pasangan nilai kunci dari file XML - icons.xml :

   xml example icon1.jpg icon2.jpg icon3.jpg 

Sekarang, mari kita muat:

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 Properti

Kita bisa menggunakan getProperty (kunci String) dan getProperty (kunci String, String defaultValue) untuk mendapatkan nilai dengan kuncinya.

Jika pasangan nilai kunci ada, kedua metode akan mengembalikan nilai yang sesuai. Tetapi jika tidak ada pasangan nilai kunci, yang pertama akan mengembalikan null, dan yang terakhir akan mengembalikan defaultValue sebagai gantinya.

Kode contoh:

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 bahwa meskipun kelas Properti mewarisi metode get () dari kelas Hashtable , saya tidak akan merekomendasikan Anda menggunakannya untuk mendapatkan nilai. Karena metode get () akan mengembalikan nilai Objek yang hanya dapat dilemparkan ke String dan metode getProperty () sudah menangani nilai Objek mentah dengan benar untuk Anda.

Kode di bawah ini akan memunculkan Exception :

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

4. Atur Properti

Kita bisa menggunakan metode setProperty () untuk memperbarui pasangan nilai kunci yang ada atau menambahkan pasangan nilai kunci baru.

Kode contoh:

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 bahwa meskipun kelas Properti mewarisi metode put () dan metode putAll () dari kelas Hashtable , saya tidak akan merekomendasikan Anda menggunakannya untuk alasan yang sama seperti untuk metode get () : hanya nilai String yang dapat digunakan di Properti .

Kode di bawah ini tidak akan berfungsi seperti yang Anda inginkan, ketika Anda menggunakan getProperty () untuk mendapatkan nilainya, itu akan mengembalikan null :

appProps.put("version", 2);

5. Hapus Properti

Jika Anda ingin menghapus pasangan nilai kunci, Anda dapat menggunakan metode remove () .

Kode Contoh:

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 File Properti

Kelas properti menyediakan metode store () untuk mengeluarkan pasangan nilai kunci.

Kode contoh:

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.

Namun, saat membaca file XML yang dienkode secara berbeda, kita dapat menentukannya dalam deklarasi DOCTYPE ; penulisan juga cukup fleksibel - kita dapat menentukan pengkodean dalam parameter ketiga dari API storeToXML () .

10. Kesimpulan

Dalam artikel ini, kita telah membahas penggunaan kelas Properti dasar , termasuk cara menggunakan Properti memuat dan menyimpan pasangan nilai kunci di kedua properti dan format XML, cara mengoperasikan pasangan nilai kunci dalam objek Properti , seperti mengambil nilai, memperbarui nilai , dapatkan ukurannya, dan cara menggunakan daftar default untuk objek Properti .

Kode sumber lengkap untuk contoh tersedia di proyek GitHub ini.