15 Mayıs 2016 Pazar

-Java Properties Kullanımı-


Merhabalar,
Java uygulamaları geliştirirken,uygulama ile ilgili birtakım ayarlar belirleyip bu ayarları uygulamamızda varsayılan(default) ayarlar olarak kullanmamız gerekebilir.
Böyle bir durumda Java'nın "properties" özelliğini kullanabiliriz. Bu özellik bir dosya üzerinden çalışır.
Belirlediğimiz bilgileri "config.properties" isimli(isim belirleme geliştiricinin insiyatifindedir) bir dosyaya kaydedebilir,gerektiği durumda bu dosya içeriğini okuyarak bilgileri kullanabiliriz.
Aslında standart dosya işlemine benzerlik gösterir. Fakat Java'da bu işlemler için belirli yardımcı Class'lar mevcuttur.
Ancak başlıca kullanacağımız Class "Properties" dir.

Properties Class'ı "java.util" paketi altında bulunur. Bu Class "Hashtable<Object,Object>" Class'dan extends edilmiştir. 
Dolayısıyla "Hashtable"'nin belli özelliklere göre düzenlenmiş halidir. Ayrıca dosya işlemleri ile ilgili birtakım işlemler için iç Class barındırır.
Örneğin config içeriği okumayla ilgili esnek yapılar,convert(hex,..) ve Xml desteği vb. gibi..
Ancak bu makalede sadece standart kullanımı işlenmiştir.
Properties Class ile ilgili daha geniş bilgi için makale sonunda verilen linki inceleyebilirsiniz.

Properties kullanımını gösteren Java uygulamasına aşağıda yer verilmiştir. Verilen uygulamada iki adet Class kullanılmıştır.
Main.java Classı uygulamanın Main kısmını içerir. Config dosyasına aktarmak istediğimiz veriler burada belirlenmiştir.
İkinci Class ise MyPropertiesClass.java dır. Bu Class içersinde Properties işlemleri yer almaktadır.
Kod satırlarında gerek görülen yerlere yorum yazılmıştır.

Main.java:
import java.io.IOException;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
/*
* Config dosyasına kaydetmek istediğimiz verileri "key,value"
* şeklinde TreeMap içersine eklenmiştir.
*/
TreeMap<String, String> treeMap = new TreeMap<String, String>();
treeMap.put("username", "kerim");
treeMap.put("password", "1234");
treeMap.put("screenSize", "1280x720");
treeMap.put("sound", "music.mp4");
 
  
try {
//TreeMap ile belirlenen içerikler Properties için MyPropertiesClass'a gönderiliyor:
MyPropertiesClass.wirteProperties(treeMap);

//Config dosyası içeriği "key,value" şeklinde alınıyor ve ekrana yazdırılıyor:
TreeMap<String, String> treeMapRead = MyPropertiesClass.readProperties();
for(String key: treeMapRead.keySet()){
System.out.println(key+ "=" + treeMapRead.get(key));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

MyPropertiesClass.java:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Properties;
import java.util.TreeMap;

public class MyPropertiesClass {

//Ayarları kaydedeceğimiz config dosyası ismi belirtiliyor. İsim belirleme geliştirici insiyatifindedir.
private static String PROPERTIES_FILE = "config.properties";
    /*kaydedilecek ayarların key değerleri tutuluyor.
     * NOT:bu yöntem geçici olarak çalışır. uygulama kapatıldığında içeriğini kaybeder.
     * Dolayısıyla uygulama için belirlediğiniz config key değerleri kalıcı olarak tutulmalıdır.
     */
private static ArrayList<String> propertiesKey = new ArrayList<String>();
public MyPropertiesClass(){
///
}

//Main.java tarafından TreeMap olarak gelen "key,value" değerleri config dosyasına yazacak fonksiyonumuz:
public static void  wirteProperties(TreeMap<String, String> _treeMap) throws IOException{
//Properties nesnesi oluşturuluyor:
Properties properties = new Properties();
//Config dosyasına yazma işlemi için File nesnesi oluşturuluyor:
OutputStream outStream = new FileOutputStream(PROPERTIES_FILE);
//döngü vasıtasıyla TreeMap içeriği okunuyor:
for(String key : _treeMap.keySet()){
//config key'leri okuma işleminde kullanmak için tutuyorum.
propertiesKey.add(key);
//Config için belirlenen her "key,value" tek tek setProperty fonksiyonuna gönderiliyor:
properties.setProperty(key, _treeMap.get(key));
}
/*tüm config ayarları aktarıldıktan sonra yazma işlemi için "store" fonksiyonu çağrılıyor:
* store fonksiyonu ikinci parametre olarak comments değerini alır.Yani config dosyası ile ilgili bir girdi belirlenebilir.
* istenmediği durumda null değeri verebilirsiniz.
*/
properties.store(outStream, "ayarlar");
   //config dosyası kapatma işlemi:
if(outStream !=null){
outStream.close();
}

}

//Config dosya içeriğini okumak için çağırdığımız fonksiyon:
public static TreeMap<String,String> readProperties() throws IOException{
//Properties nesnesi oluşturuluyor:
Properties properties = new Properties();
//Config dosyasını okumak için File nesnesi oluşturuluyor:
InputStream inputStream = new FileInputStream(PROPERTIES_FILE);

//Config içeriği properties nesnesine yükleniyor:
properties.load(inputStream);

//Main.java tarafına göndermek için TreeMap oluşturuyoruz:
TreeMap<String, String> treeMap = new TreeMap<String, String>();
//Daha önce sakladığım config key'leri ile döngü oluşturuyoruz:
int size = propertiesKey.size();
    for(int i=0;i<=size - 1;i++ ){
    //getProperty fonksiyonu ile key değeri verilen config ayarları okunuyor:
treeMap.put(propertiesKey.get(i), properties.getProperty(propertiesKey.get(i)));
}

return treeMap;
}
}

Oluşturulan "config.properties" dosyası java projenize ait dizinde yer alır.
Config Dosya içeriği:

#ayarlar
#Sun May 15 19:09:02 GMT-12:00 2016
sound=music.mp4
username=kerim
screenSize=1280x720
password=1234

Program çıktısı:
password=1234
screenSize=1280x720
sound=music.mp4
username=kerim

Detaylı bilgi için:
https://docs.oracle.com/javase/tutorial/essential/environment/properties.html
https://docs.oracle.com/javase/7/docs/api/java/util/Properties.html

İyi çalışmalar.

Hiç yorum yok:

Yorum Gönder