i/o etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
i/o etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

12 Ocak 2015 Pazartesi

Serialization/Serileştirme

                Bugünkü konumuz serizilation yani serileştirme olacak. Peki nedir serileştirme diye kısaca söyleyecek olursak bir andaki durumu kaydetme , daha sonra da kayıtlı olan durumu çekme işlemine diyoruz. Serileştirme özellikle network ve persistance işlemlerinde sıkça kullanılır. Serileştirmeyi kullanabilmemiz için implements Serializable . yazmamız gerek. Buradan anlayacağımıza göre serileştirme interface/ara birimdir. Şimdi konuyu daha iyi anlayabilmek için kod üzerinden devam edelim.

class Dog implements Serializable {
                String name = "Karabas";
}

public class SerializeDog {
public static void main(String[] args)
 throws IOException, ClassNotFoundException {
    Dog dog = new Dog();//dog objesi oluşturuyoruz

    FileOutputStream fos = new FileOutputStream("dog.serial");
    //dog.serial diye kaydediyoruz,farklı bir şey de olabilir
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(dog);//oluşturduğumuz objeyi kaydediyoruz
    oos.flush();//bufferden bağımsız kaydeder
    oos.close();//açık olanı kapatmak zorundayız
                              
    FileInputStream fis = new FileInputStream("dog.serial");
    //şimdi okuma işlemini yapıyoruz
    ObjectInputStream ois = new ObjectInputStream(fis);                         
    Dog deserializedDog = (Dog)ois.readObject();
    //veri kaybı olmaması için cast yapıyoruz
    System.out.println(deserializedDog.name);//ekrana yaz
    ois.close();//açılan dosyayı kapat
                              
                }
}

Peki tüm değişkenleri serileştirmek zorunda mıyız diye bir soru akla gelebilir. Tam da bu nokta transient keywordu karşımıza çıkar. Serileştirmek istemediğimiz değişkenin başına yazıyoruz. Mesela yukarıdaki örneğimizde eğer transient String … yapsaydık çıktımız null olacaktı. Şimdi de son bir örnek verip , o örnekler üzerinde farklı işlemler yaparak nasıl farklı çıktıları aldığımızı incelemeye çalışacağız. Bu açıdan konunun daha iyi pekişeceğini inanıyorum. Çünkü neden bu böyle olmuş , böyle olursa ne olur gibi sorularının cevabını da bulmuş olacağımıza inanıyorum. Şimdi kodumuzu yazalım

class Animal { //serileştirme işlemi yapılsa çıktı değişir
int height = 30;
        //String name="akbas";*
}

public class Dog extends Animal implements Serializable {
String name;//* bu kodu silmezsek yukarıdaki name değişkeni pasif kalır

public Dog(int height, String name) {
this.height = height;// bu satırları silerken 
this.name = name; // çıktımız 30 akbas olur !!
}

public static void main(String[] args) throws IOException, ClassNotFoundException {
    FileOutputStream fos = new FileOutputStream("dog.ser");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    Dog dog = new Dog(50, "karabas");
    System.out.println(dog.height + " " + dog.name);
    oos.writeObject(dog);
    oos.close();

    FileInputStream fis = new FileInputStream("dog.ser");
    ObjectInputStream ois = new ObjectInputStream(fis);
    Dog deserializedDog = (Dog) ois.readObject();
    System.out.println(deserializedDog.height + " " + deserializedDog.name);
    ois.close();
}

}
  Çıktı:
50 karabas
30 karabas

    Burada çıktımız yukarıdaki gibi oldu. Fakat niye böyle oldusunu irdeleyelim isterseniz. Çünkü deserializetion işlemi sırasında yapılandırıcılar ve değişkenlere değer atanamıyor. Bu nedenle çıktımız böyle oldu. Dikkat edin Animal sınıfımıza serileştirme işlemi yapılmamış , eğer ona da serileştirme işlemi yaparsak bu sefer çıktımız değişecektir. Farklı satırlara bazı bilgiler ekledik. Sizler de aklınıza takılan soruları kodu değiştirerek daha iyi anlayabilirsiniz. Kolay gelsin

Kaynak
http://www.injavawetrust.com/pure-java-60-file-and-io-05-serialization/


Dosyalarda Giriş Çıkış İşlemleri

      Bugünkü konumuzda I/O işlemlerini anlatmaya çalışacağız. Bunun için farklı sınıflar metodlar kullanılmaktadır. Biz de bunlardan bir kaç tanesini ele almaya düşünüyoruz. Şimdi yavaştan başlayalım. Öncelikle dosya işlemini ele alalım. Burada dosya içeriği oluşturulmaz sadece dosya yoksa oluşturulur varsa herhangi bir işlem yapılmaz. Şimdi örneklersek daha iyi anlayacağımızı düşünüyorum

public class FileTest {

public static void main(String[] args) throws IOException {
File file = new File("test.txt");// burada sadece obje oluşturulur
System.out.println(file.exists()); // dosya var mi ?
System.out.println(file.createNewFile()); // doya yoksa oluşturulur
System.out.println(file.exists()); // tekrar kontrol et !

}
}

   Bu kodu ilk çalıştırdığımızda kodumuz
false
true
true
   2.defa çalıştırığımızda ise
true
false
true

döndürecektir. Bunun nedeni ise ilk çalıştırdığımızda test diye bir dosya yoktur. file.createNewFile ile oluşturulur. Daha sonra tekrar kontrol ettiğimzide artık böyle bir dosya mevcut elimizde ve true dönüyor. 2.sefer çalıştırıdığımızda ise bu sefer dosya olduğu için true döndürür ve yeni dosya oluşturulmadığı için creanteNewFile false değer döndürür.

      Şimdi de File ile ilgili daha farklı özelliklere göz atalım. Şimdi de dizin oluşturma ve oluşturduğumuz dizi içerisine dosya oluşturma işlemine göz atalım.

public static void main(String[] args) throws IOException {
File mydir = new File("mydirectory");
mydir.mkdir();  // dizin olusturma islemi atlandi.
        //eğer yukarıdaki dizi oluşturmadan txt oluşturmaya kalkışırsak hata verir
File file = new File(mydir, "test.txt");//oluşan dizi içine txt oluşur
file.createNewFile();

}

Şimdi de silme işlemine göz atalım. Ama unutmamız gereken bir şey var ki o da  dizin altında herhangi bir klasör varsa dosya silme işlemini gerçekleştirmez. Onun için öncelikle dosyaları daha sonra boş olan klasörleri silebiliriz. Buraya dikkat etmemiz gerekir. Şimdi de yukarıdaki koda ek olarak aşağıdaki kodu veriyoruz.

// dizin bos olmadiginda silme islemi yapilamaz.
// false deger donecektir
System.out.println(mydir.delete());

// dosya silinir , true deger donecektir
System.out.println(file.delete());

// dizin icerisindeki dosyayi sildikten sonra tekrar deneyelim.
System.out.println(mydir.delete()); //ve artık silme işlemi tamamlanır

Bunun gibi daha farklı işlemler bulunmaktadır. İsim değiştirme listeleme gibi işlemler bulunur. Bunlara da göz atılabilir. Biz şimdilik bunlara girmiyoruz. Son olarak da dosyaya yazma ve okuma ile yazıyı bitiriyoruz

public static void main(String[] args) throws IOException {

    File file = new File("file.txt");

    FileWriter fw = new FileWriter(file);
    fw.write("java");
    fw.write(" 6");
    // write metodu ile String veya char array yazabiliriz. 
    // int alan   yapilandiricisi ilgili sayinin unicode degeridir.
    fw.flush(); // Verinin bufferdan bağımsız diske hemen yazılmasını sağlar
    fw.close(); // IO islemlerinde , DB baglanma islemlerinde close metodu
    // cagrilmalidir. Bu baglantinin kapatilmasi anlamina gelmektedir.
    // Acik baglanti birakmamak icin close metodunu cagirmayi unutmayalim !

    char[] input = new char[50];
    int size = 0;
    FileReader fr = new FileReader(file); // FileReader objesi olusturduk
    size = fr.read(input); // dosya icerigini oku
    System.out.println("size:" + size); // kac byte okundu ?

    for (char c : input) {
    System.out.print(c);
         }
    fr.close();
    }
}