JAVA SE | FILE OPERATIONS

   Merhaba arkadaşlar. Öncelikle finallerim dolayısıyla iki hafta kadar yazılarıma ara vermek durumunda kalmıştım, bunun için özür diliyorum. Bu hafta sizlere Java SE yazılarımın 10. konusu olan dosya işlemlerinden (file operations) bahsedeceğim. Öncelikle herhangi bir programlama dili ile çalışırken neden dosya işlemlerine ihtiyaç duyarız bu soruya bir açıklık getirelim. Dosyaları tıpkı veritabanları gibi, verileri kalıcı bir şekilde saklamak için kullanırız. Bugüne kadar ki yazılarımızda kullandığımız çeşitli veri yapılarına bir göz gezdirecek olursak; değişkenler, diziler, List ve Map sınıflarından türetilmiş yapılar, bunların hepsi programımızın çalışması sırasında bilgisayarımızın memory ünitesinde saklanır. Bildiğiniz gibi RAM’deki veriler uçucudur (volatile), yani program sonlandırıldığında yada elektrik kesildiğinde RAM üzerinde bulunan tüm veriler yok olur. Bu nedenle dosya sistemlerinden faydalanarak verilerimizi sabit diskimiz üzerinde dosyalarda saklamak ihtiyacı hissederiz.

Bu yazıda, “.dat” uzantılı dosyalara veri yazma/okuma üzerine duracağız. Dat uzantılı dosyalarda veriler txt’nin aksine şifreli bir şekilde saklanır. Dosyadan okuma yapılırken de aynı şekilde şifrenin çözülerek okunması gerekmektedir. Bu işlem için java.io.Serializable interface’i dosyaya yazılacak olan tüm sınıflar tarafından implement edilmelidir. Aksi durumda java.io.NotSerializableException hatası alırız. Serializable interface’ini implement eden class’larımızda

private final static long serialVersionUID = 1L;

tanımlamasını yapmanızı tavsiye ederim.

Bunun dışında dosyaya yazma ve dosyadan okuma işlemlerinin gerçekleştirilebilmesi amacıyla java.io paketi içerisinde çeşitli sınıflar mevcuttur. Biz bu yazıda .dat uzantılı dosyalarla çalışacağımızdan ObjectOutputStream ve ObjectInputStream class’larını kullanacağız. Dediğim gibi bu iki class da java.io paketi içerisinde bulunmaktadır. Dolayısıyla bu sınıfları kullanabilmemiz için okuma/yazma işlemi yapılacak olan sınıfta bu iki sınıfı import ederek projeye dahil etmemiz gerekir. Bu temel bilgileri verdikten sonra isterseniz gelin hep beraber küçük bir uygulama üzerinde Java’da File Operations konusuna bir giriş yapalım.

Uygulamamız küçük bir telefon defteri uygulaması olsun. Kişilerin ad-soyad ve telefon bilgilerini .dat uzantılı bir dosyaya yazıp (save), yine aynı dosyadan okuma (load) işlemi yapalım. Bunun için Insan, TelefonDefteri ve Test isminde 3 adet class’ımız olsun. Test class’ı main metodu içerecek ve programımız burada çalışacak. Burada TelefonDefteri sınıfımızdaki rehber bilgilerini dosyaya yazıp okuyacağımızdan bu sınıfta java.io paketi içerisindeki ObjectOutputStream ve ObjectInputStream class’larını import edeceğiz. Okuma/yazma işlemleri çeşitli olası hataları fırlatabileceği için bu işlemleri try-catch blokları arasında yapacağız ve dolayısıyla bu hata sınıflarını da import etmemiz gerekecektir. Bunun için


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

yukarıdaki sınıfları TelefonDefteri classına import ederek dahil ettik. Şimdi sınıflarımızı görecek olursak;

  • Insan Sınıfı

insan

 

  • TelefonDefteri Sınıfı

rehber1

rehber2

rehber3

 

  • Test Sınıfı

test1

test2Sınıflarımızı kısaca açıklayacak olursak;

Insan sınıfı bir adet constructor ve get-set metotları ile bir adet bilgilerini ekrana yazdıran kendiniTanit metodundan oluşmakta. TelefonDefteri sınıfı, kayıtlı kişilerin tutulacağı bir liste, giriş/çıkış için bir Scanner ve versiyonlama için bir adet SerialVersionUID değişkeni barındırmakta. Metotlarını incelediğimizde, bir adet constructor bulunmakta. Bu constructor içerisinde ArrayList initialize ediliyor. Get-set metotları dışında kisiBul isimli metot bir search işlemi yapıyor, Telefon numarası bilgisini parametre olarak alıyor ve bu telefon numarasına sahip olan kişiyi bulursa döndürüyor, bulamazsa null döndürüyor. Belki farketmişsinizdir bu sınıf içerisinde telefon numarasının unique (tekil) olmasını sağlayacak bir tedbir alınmamış. Eğer aynı telefon numarasına sahip iki kişi bu rehbere eklenirse herhangi bir hata oluşmayacak ve bu numara ile search yapıldığında ilk bulunan kişi döndürülecek. Burada bu açıdan bir eksiklik mevcut. Uygulamalarınızda bu tarz durumları da göz önüne almanız gerektiğini vurgulamak için burada böyle bir açık bıraktım. KisiDuzenle metodu parametre olarak bir Insan nesnesi alıyor ve bu insanı search ederek eğer mevcut ise kişi bilgilerini değiştiriyor, değilse ekrana bir uyarı vererek işlemi sonlandırıyor. DosyaYaz ve dosyaOku metotlarına gelecek olursak, dosya adını bir String içerisinde tutarak ObjectOutputStream ve ObjectInputStream sınıflarını kullanarak yazma/okuma işlemi yapılıyor. Bu işlemler oluşabilecek hatalardan ötürü try-catch blokları arasına alınmış durumda ve işlemler sona erdiğinde iki metotta da okuyucu/yazıcı nesneleri close() metodu ile kapatılmış bulunuyor. Ek olarak dosyaOku metodundaki TypeCasting işlemine dikkatinizi çekmek istiyorum. “makale10.dat” isimli dosyadan readObject() metodu ile veri tek seferde okunuyor fakat bu verinin atanacağı değişkenin tipine uygun olarak cast edilmesi gerekir. Aksi durumda IDE’miz zaten hata verecektir. Bu durumu önlemek için (ArrayList<Insan>) şeklinde okunan veriyi Insan nesneleri içeren bir ArrayList’e cast ediyoruz.

Şimdi hep beraber programımızın çalışmasıyla birlikte oluşan output’u görelim.

sonuc

Gördüğünüz gibi indisi 4 olan (indisler sıfırdan başladığı için 5. kayıt) olan Fatma Fatmaoğlu listede aranıyor ve bulunduğu için yeni bilgileri girilerek güncelleniyor. Ardından rehber son haliyle makale10.dat adıyla projenin bulunduğu klasöre yazılıyor. Test sınıfındaki liste temizleniyor ve aynı dosyadan okuma yapılarak kayıtlar listeye yazılıyor ve ekrana basılarak kullanıcıya gösteriliyor.

Evet arkadaşlar, dosya okuma/yazma ile ilgili temel bilgileri vererek küçük bir uygulama ile bu bilgileri pekiştirdiğimizi düşünüyorum. Her zaman olduğu gibi herhangi bir sorunuz olursa yorum yazarak sorabilirsiniz. Önümüzdeki yazıda Thread konusuna değineceğim. Gelecek derse kadar sağlıcakla kalın.

Hepinize bol Java’lı günler.

Facebook'dan yorumla