Merhaba arkadaşlar, Bugün ki dersimizde java programlama dili ile seçilen klasörün içindeki tüm dosyaları(klasör hariç) listeleyen bir program yapacağız. Bunu yaparken recursive olmasını sağlayacağız. Öncelikle Netbeans IDE programını açarak bir proje oluşturalım.
Evet projemizi oluşturduk. Şimdi ise kodlarımızı yazmaya başlamadan önce yapacaklarımızı sırasıyla belirtelim.
- Öncelikle bir klasör seçmek gerekiyor = Bunun için JFileChooser nesnesini kullanabiliriz. (javax.swing.jFileChooser) Klasör seçtikten sonra oradan alacağımız dosya konumunu String olarak döndürmemiz gerektiğini düşünürsek, String döndüren bir metot kullanmamızın uygun olacağını söyleyebiliriz.
- Dönen String değerinin yani klasörün konumunun(path) içinde bulunan dosya ve klasörleri bir yere atmamız gerektiğinden bunun için String veri tipini kullanan bir ArrayList kullanabiliriz.
- Seçtiğimiz klasörün içinde dosya ve yine klasörler bulunabilir. Dosyaları alabiliriz fakat yine klasörlerin içine girip ilgili aramalar yapmamız gerekebilir. Hatta girdiğimiz klasörlerin içinde de klasörler bulunabilir. Bunu yapmak için recursive metot kullanmamız gerektiğini düşünebiliriz. Kullanacağımız metot kesinlikle recursive olmalıdır. Bu sayede fazla kod kalabalığı olmadan istediğimiz sonuca ulaşabiliriz. (recursive’in önemli bir faydası)
- Sonucu console a yazdıralım.
Üstteki algoritmik yapıyı oluşturduktan sonra şimdi bunları koda dökme vakti geldi. Öncelikle birinci adımı uygulayalım.
Birinci Adım : Bu adımda klasör seçen bir fonksiyon yazacağız. (Fonksiyon ismi “public static String klasorSec()” )
Kullanacağımız Nesneler : javax.swing.JFileChooser
Şimdi aşağıdaki kodu inceleyelim.
import java.util.ArrayList; import javax.swing.JFileChooser; public class KlasorSec { public static String klasorSec(){ JFileChooser jFileChooser = new JFileChooser(); // Nesnemizi oluşturduk jFileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);// burada directory(klasör) seçebileceğimiz belirttik jFileChooser.showOpenDialog(null); // Dialog penceresinin açılmasını sağladık try { return jFileChooser.getSelectedFile().getAbsolutePath(); // seçilen klasörün yolunu aldık. Seçim yapmadıysak catche düşecektir. } catch (Exception e) { return null; // Eğer seçim yapamadıysak buraya düşer ve null değerini alır } } public static void main(String[] args) { // metotumuzu çalıştırmamız için main fonksiyonu yazıyoruz String klasorYolu = KlasorSec.klasorSec(); // seçilen klasör yolunu nesneye atıyoruz if(klasorYolu != null) // eğer seçim boş değilse yani nulll değilse işlemlerimizi bu koşul ifadesinin altında yapacağız System.out.println("Klasor : "+klasorYolu); // console ekranına yazdırıyoruz else System.out.println("Herhangi bir klasör yolu seçilmemiştir."); // herhangibir klasör seçmezsek bu hatayı console ekranından verdiriyoruz } }
Ardından projemizi çalıştırıyoruz ve bir klasör seçiyoruz.
Klasör seçtikten sonra Open butonuna basıyorum ve aşağıdaki sonucu alıyorum
Gördüğünüz üzere gayet güzel gidiyoruz. Bir de klasör seçmeden cancel butonuna basıp çıkalım ve sonucu görelim.
Evet… Şimdi try, catch yapısını kullanmanın güzelliğini de görmüş olduk. Eğer bu yapıyı kullanmadan kodları arka arkaya yazıyor olsaydık, java.lang.NullPointerException hatası alacaktık ve programımız hatayı aldığı yerden itibaren çalıştırması gereken altındaki kodları çalıştırmayacaktı. Yani programımız istemediğimiz bir şekilde sonlanacaktı.
Birinci adımı tamamladığımıza göre, şimdi ikinci adıma geçelim.
İkinci Adım : Şimdi dönen String değerinin yani klasör yolunun içindeki dosyaları taradıktan sonra dosya isimlerini atacağımız String türünde bir ArrayList tanımlayalım.
Kullanacağımız Nesneler : java.util.ArrayList
Şimdi aşağıdaki kodu inceleyelim.
import java.util.ArrayList; import javax.swing.JFileChooser; public class KlasorSec { ArrayList<String> dosyaList = new ArrayList<String>(); // ikinci adımda gereken dosyaList global olarak tanımladım. Bu sayede bu sınıfta istediğim fonksiyondan erişebilirim public static String klasorSec(){ JFileChooser jFileChooser = new JFileChooser(); // Nesnemizi oluşturduk jFileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);// burada directory(klasör) seçebileceğimiz belirttik jFileChooser.showOpenDialog(null); // Dialog penceresinin açılmasını sağladık try { return jFileChooser.getSelectedFile().getAbsolutePath(); // seçilen klasörün yolunu aldık. Seçim yapmadıysak catche düşecektir. } catch (Exception e) { return null; // Eğer seçim yapamadıysak buraya düşer ve null değerini alır } } public static void main(String[] args) { // metotumuzu çalıştırmamız için main fonksiyonu yazıyoruz String klasorYolu = KlasorSec.klasorSec(); // seçilen klasör yolunu nesneye atıyoruz if(klasorYolu != null) // eğer seçim boş değilse yani nulll değilse işlemlerimizi bu koşul ifadesinin altında yapacağız System.out.println("Klasor : "+klasorYolu); // console ekranına yazdırıyoruz else System.out.println("Herhangi bir klasör yolu seçilmemiştir."); // herhangibir klasör seçmezsek bu hatayı console ekranından verdiriyoruz } }
Üstteki kodları incelediğiniz zaman ArrayList’i nasıl oluşturduğumuzu da görmüş olursunuz.
Şimdi ArrayList oluşturduğumuza göre Üçüncü adıma geçelim.
Üçüncü Adım : Şimdi esas işi yapacak olan recursive fonksiyonumuzu yazalım.
Şimdi aşağıdaki recursive kodu inceleyelim. dosyaPathDondur fonksiyonuna bakalım. İşlemi yapan recursive fonksiyon budur.
import java.io.File; import java.util.ArrayList; import java.util.List; import javax.swing.JFileChooser; public class KlasorSec { ArrayListdosyaList = new ArrayList (); // ikinci adımda gereken dosyaList global olarak tanımladım. Bu sayede bu sınıfta istediğim fonksiyondan erişebilirim public static String klasorSec() { JFileChooser jFileChooser = new JFileChooser(); // Nesnemizi oluşturduk jFileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);// burada directory(klasör) seçebileceğimiz belirttik jFileChooser.showOpenDialog(null); // Dialog penceresinin açılmasını sağladık try { return jFileChooser.getSelectedFile().getAbsolutePath(); // seçilen klasörün yolunu aldık. Seçim yapmadıysak catche düşecektir. } catch (Exception e) { return null; // Eğer seçim yapamadıysak buraya düşer ve null değerini alır } } public void klasorListeleriniKonsoldaGoster() { // dosya isimlerini yazdırdığımız fonksiyon dosyaList.forEach((dosyaPath) -> { // System.out.println("Dosya Yolu : " + dosyaPath); }); } public void dosyaPathDondur(File fileDirectory, List dosyaList) { // iki tane parametremiz var if (fileDirectory.exists() && fileDirectory.isDirectory()) { // o dosya gerçekten varsa ve klasör ise for (File chDir : fileDirectory.listFiles()) { // içindeki dosyaları ve klasörleri listeler if (chDir.isDirectory()) { // eğer klasör ise dosyaPathDondur(chDir, dosyaList); // tekrar fonksiyona girer - Recursice } else { dosyaList.add(chDir.getAbsolutePath()); // lsitemize ekleme işlemi yapar } } } } public static void main(String[] args) { // metotumuzu çalıştırmamız için main fonksiyonu yazıyoruz String klasorYolu = KlasorSec.klasorSec(); // seçilen klasör yolunu nesneye atıyoruz if (klasorYolu != null) // eğer seçim boş değilse yani nulll değilse işlemlerimizi bu koşul ifadesinin altında yapacağız { System.out.println("Klasor : " + klasorYolu); // console ekranına yazdırıyoruz KlasorSec klasorSec = new KlasorSec(); // nesnemizi oluşturuyoruz klasorSec.dosyaPathDondur(new File(klasorYolu), klasorSec.dosyaList); // gerekli parametreleri giriyoruz klasorSec.klasorListeleriniKonsoldaGoster(); // konsola yazdırıyoruz } else { System.out.println("Herhangi bir klasör yolu seçilmemiştir."); // herhangibir klasör seçmezsek bu hatayı console ekranından verdiriyoruz } } }
Gerekli açıklamaları yorum olarak ekledim. Bunları inceleyiniz.
Dördüncü Adım : Şimdi console çıktısına bakalım.
Aşağıdaki klasörü seçiyoruz.
Evet gördüğünüz gibi gayet başarılı bir şekilde istediğimizi yapmış olduk. Recursive fonksiyonlar oldukça faydalı olup az satırla çok iş yapmamızı sağlarlar. Bu örneği kendiniz de yazmaya çalışarak geliştirebilirsiniz. Okuduğunuz için teşekkür ederim.