Merhaba Arkadaslar,
Bu makelenin içerdigi konular;
ObjectInputStream, ObjectOutputStream, FileInputStream, FileOutputStream, ArrayList ve Serializable hakkindadir.
Programimiz çoklu pencerelerden olusan, text ve binary dosyalarini okuma ve yazma özelligine sahiptir.
Binary dosyasina ObjectOuputStream kullanarak yazma islemini gerçeklestiriyoruz. Burada da tüm arraylistteki veriyi tek seferde yazma ve okuma islemi gerçeklestirsin istiyoruz. Bunun için implements Serializable metotlarindan yaralanacagiz.
Simdi koddumuzdan biraz bahsedelim.
Öncelikle engineers classini yazalim. Gayet basit bir class basinda implements Serializable var. Bu sayede ObjectOutputStream kullanarak dosyaya yazabiliyoruz. Sagladigi fayda, bu classin bir stream halinde kullanilabilmelidir. Yani;
ObjectOutputStream objo= new ObjectOutputStream(new FileOutputStream("binary.bin"));
objo.writeObject(new engineers(....));
objo.close();
seklinde kullanabiliyoruz. Hazir gelen çogu class zaten Serializable, bu yüzden aslinda engineers classini Serializable yapmama gerek yoktu. Çünkü hep ArrayList kullandim ki o da Serializable.
Çoklu pencerelere deginelim.
Bunlari visual class seklinde olusturdum. Ilk olarak main(engMain) ve ikincil penceremizin(readTxtFrame) tasarimini yapip bitiriyoruz. Sonra mainin üst tarafina;
private readTxtFrame rtf1= new readTxtFrame(this);
ekliyoruz. Böylece ikinci frameden objeyi çagirabilecegiz. Ayrica bunun constructorina this gönderiyoruz. Yani main framein içinde ne varsa hersey. Bunun için ikinci framein constructorini düzenleyecegiz. Bundan sonra main de ilgili butonun click olayina;
rtf1.setVisible(true);
setVisible(false);
yaziyoruz. Ikinci pencereyi gösterip maini görünmez yaptik. Bu arada programin her yerinde bilgiler ArrayListlerde tutuluyor. Mainde ArrayListimizi yukarida tanimladik. Ikinci frame üzerinde yine;
engMain em = null;
ArrayList<engineers> a = new ArrayList<engineers>();
Tanimlarimizi yaptik. Main Frameden bir obje olusturduk. Bunu mainin yukarisinda this seklinde gönderdigimiz engMain objesine esitleyecegiz ki mainde ki objeleri çagirabilelim(private olanlari degil). Sonra constructori tekrar düzenliyoruz.
public readTxtFrame(engMain f)
{ //mainden gelen this.
super();
initialize();
em= f; //burada atamamizi yaptik.
}
read from file ve show in text area butonlarindaki kodlar neredeyse standart dosya açma ve yazdirma. Koddan inceleyebilirsiniz. Bu formda çoklu pencere kullanimi adina close butonu önemli.
Bu butonun click olayina asagidaki kod blogu yazili.
em.setArray(a);
em.setLabel("Data read and Array is filled and returned to main.");
em.setVisible(true);
dispose();
Simdi bunu biraz inceleyelim.
em.setArray(a); dedigim gibi ne kadar em adinda mainden bir obje olusturmus olsakta private nesnelerine dokunamayiz. public ve protected olanlara sartlar dahilinde istedigimizi yapariz. setArray fonksiyonunu main içinde yaziyoruz. Böylece elde ettigimiz bilgi maine gidecektir.
public void setArray(ArrayList<engineers> a)
{
arr=a;
}
Bir de bilgilendirme amaçli yine ayni mantikla setLabel fonksiyonumuz var. maini görünür yapiyoruz ve ikinci formu dispose() metodu ile ramden kaldiriyoruz. Böylece en karmasik kisim bitmis oldu.
display all information butonu için dispAllInfo visual classini yazacagiz. Bu framee sadece arraylisti gönderecegiz ve bize sadece çikti verecek. Butonun click olayina (main içinde);
dispInfoFrame dif = new dispInfoFrame(arr);
dif.setVisible(true);
jLabel1.setText("display info button does not return anything to main...");
giriyoruz. Ilk satiri yukarida yazabilirdik ancak daha önce olusturulmadigindan null pointer exceptiona düsüyor. Görünür yapiyoruz ve labela bilgilendirici birseyler yaziyoruz.
dispInfoFramede ise sadece arraylistden obje olusturup mainden geleni buna esitliyoruz ve içinde for döngüsüyle text areaya çikti veren bir fonksiyon yazarak onu çagiriyoruz.
public dispInfoFrame(ArrayList<engineers> a)
{
super();
initialize();
arr= a;
showContent(a);
}
public void showContent(ArrayList<engineers> a)
{
for (int i = 0; i < a.size(); i++)
{
jTextarea.append(a.get(i).toString()+ "\\n" );
}
}
close butonunda da sadece dispose() var.
Build binary butonuda sadece dosyayi olusturmak için açip kapatiyoruz.
ObjectOutputStream objo = new ObjectOutputStream(new FileOutputStream("binary.bin"));
Sonrasinda, writeToBinaryFramei olusturuyoruz yine ilgili butonun click olayinda arraylisti göndererekten çagiriyoruz.
write bin butonunda binary dosyaya yazma islemini yaptik.
try
{
ObjectOutputStream objo= new ObjectOutputStream(new FileOutputStream("binary.bin"));
objo.writeObject(arr);
objo.close();
}
catch(Exception e2)
{
JOptionPane.showMessageDialog(null, "something happened..." + e.toString());
}
objo.writeObject(arr); gördügünüz gibi herseyi tek seferde dosyaya aktardik.
read into text area butonunda da okumasi ve textareaya basma islemi var.
try
{
ObjectInputStream inpo = new ObjectInputStream(new FileInputStream("binary.bin"));
ArrayList<engineers> temp= (ArrayList<engineers>)( inpo.readObject());
for(int i = 0; i < temp.size(); i++)
{
jTextarea.append(temp.get(i).toString() + "\\n");
}
inpo.close();
}
catch(Exception e2)
{
JOptionPane.showMessageDialog(null, "something happened..." + e.toString());
}
Tekrar binary dosyasini okudugumuzda arraylisti tek seferde elde etmis olduk.
readBinWriteTextFrame classimizda ise ilk butonda yukaridaki gibi binary dosyadan okuma islemi ve ayni try-catch içine aldigimiz bilgiyi text dosyasina yazma kodumuzu ekledik. Bunu da;
PrintWriter pw = new PrintWriter(new FileOutputStream("engineers2.txt"));
sayesinde yaptik. display butonunda tekrar text dosyadan okuma islemi var. Sadece satir satir okuyup text areaya basiyoruz ve programimiz diger önemsiz noktalari hariç bitmis oluyor.
Programin kaynak koduna baglantidan erisebilirsiniz.
Iyi çalismalar...