3 Ekim 2012 Çarşamba

Java JFileChooser dosya açma ve kaydetme mantığı.

http://yazilimsozluk.com/Default.aspx?KonuId=1674 da bir soruya cevap olarak benim tarafımdan yazılmıştır.


Dostum şimdi o olay şöyle. Şimdi adam menübar ı açtı. Aç a bastı. Bir path e ilerledi bir dosya seçti ve open a bastı. Sen burada getSelectedFile diyip adamın seçtiği dosyayının referansını alman lazım.
Bu dosya ne dosyası ise istersen bu dosyayı okuyup adama içeriğini gösterip üstünde değişiklik te yaptırabilirsin, neyse.
Şimdi bu dosyayı başka bir yere kayıt ediceksin diyelim. Senin yine filechooser ın showSaveDialog unu kullanman lazım. Onu açıcaksın adam bir path seçicek, aşağıdan dosyanın ismini girecek ve kaydet e basıcak.
Kaydet e bastığında senin daha önce açılmış dosyayı byte byte okuyup adamın seçtiği yere yazman lazım.
Okuyup yazarken fileinputstream,fileoutputstream kullanabilirsin. Ya da fileutils gibi bir kütüphane nin copy metodunu da kulanabilirsin ya da channel acıp yollayabilirsin.
Biraz da kodda anlatmaya çalışayım.

Şimdi adam menübar dan aç a bastığında

//frmDosyaAcKaydet JFileChooser tipinde.
frmDosyaAcKaydet.showSOpenDialog(anaFrame);

diyip açtın dosya açma kısmını. Adam seçti dosyayı. Dosyayı seçtiği anda senin şöyle bir kod çalıştırman lazım.

//Kullanıcının seçtiği dosya. io kütüphanesinin File tipinde dönen bir değer
//frmDosyaAcKaydet JFileChooser tipinde.
acilanDosya = frmDosyaAcKaydet.getSelectedFile();

şimdi bu değeri bir yerde tuttun. Adamın seçtiği dosyaya bir referansın var artık.

Daha sonra adam menubar dan kaydet e bastığında senin

//frmDosyaAcKaydet JFileChooser tipinde.
frmDosyaAcKaydet.showSaveDialog(anaFrame);

gibi bir kod çalıştırman lazım. Bu şekilde istediğin gibi bir kaydetme frame i açılmış olacak. Adam sonra gitti bir path e dosya adını girdi ve kaydet butonuna bastı. Çalışacak kod şöyle birşey olmalı.

//frmDosyaAcKaydet JFileChooser tipinde.
//Kullanıcının kaydetmek için seçtiği path ve dosya adı. io kütüphanesinin File tipinde dönen bir değer
File kaydedilecekDosya = frmDosyaAcKaydet.getSelectedFile();
  //Dosya yazmak için output stream açıyoruz
  OutputStream st = null;
  try {
   st = new FileOutputStream(kaydedilecekDosya);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  }
  //Byte array tanımlıyoruz. Buradan dosyayı okuyup outputstream vasıtasıyla yeni yere yazıcaz.
  byte[] buffer=new byte[1024];
  int okunanByte=0;
  //Dosyayı burada 1024 lük bloklar halinde okuyup yeni
  //path ine yazıyoruz.
  try {
   while ((okunanByte=acilanDosya.read(buffer))>0){
    try {
     st.write(buffer,0,okunanByte);
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  } catch (IOException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
  try {
   st.flush();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  try {
   acilanDosya.close();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  try {
   st.close();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

  Böylece dosyayı yeni yerine yazmış oluruz. Bu okuma ile yazma arasında geçen sürede dosya üzerinde istediğin
  değişiklikleri yapıp o şekilde de yazabilirsin. Mesela bir text dosyasıysa dosyayı açarsın stringbuffer a alıp
  kullanıcıya gösterirsin üstünde değişiklikler yapar kullanıcı daha sonra da değişiklikyapılandosya.getBytes();
  ı alıp fileoutputstream in write metodunu kullanarak yeni yerine yazabilirsin.

  Benden bu kadar :-) . Umarım işine yarar dostum. Takıldığın ya da anlamadığın birşey olursa
  yardımcı olmaya çalışırım yine. Kolay gelsin.

Hiç yorum yok:

Yorum Gönder