İçeriğe geç

Menü

Berk Akademi
Yorumlar Google yorumları Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Java'da Dosya ve Klasör Listeleme Nasıl Yapılır? listFiles() Rehberi

java-dosya-ve-klasor-listeleme
Bu yazıda neler var?
  1. Klasör yolu File nesnesine nasıl verilir?
  2. listFiles() ile klasörün içeriği nasıl alınır?
  3. Dosya ile klasör nasıl ayrılır: isFile() ve isDirectory()
  4. Yalnızca .txt dosyalarını listeleyen çalışan örnek
  5. null döndü ya da liste boş geldi: adım adım teşhis

Java'da dosya ve klasör listeleme, klasör yolunu bir File nesnesine vererek ve bu nesne üzerinde listFiles() metodunu çağırarak yapılır. Metot, klasörün içindeki dosya ve alt klasörleri File[] dizisi olarak döndürür. Burada dikkat edilecek nokta şudur: listFiles() sonucu null olabilir; döngüden önce sonucu kontrol etmek gerekir.

Klasör yolu File nesnesine nasıl verilir?

Java'da klasör de dosya da File sınıfıyla temsil edilir. new File("belgeler") yazdığında yalnızca bir yol tanımı oluşur; diskte bu adda bir klasör bulunup bulunmadığına bakılmaz. Nesne, var olmayan bir yol için de sorunsuz oluşturulur. Hata ancak o yolla bir işlem yapmaya çalıştığında ortaya çıkar.

Yol iki biçimde verilebilir. Mutlak yol konumu en baştan tam olarak belirtir. Göreli yol ise "belgeler" örneğindeki gibi yalnızca klasör adından oluşur ve programın çalıştığı klasöre, yani çalışma klasörüne göre çözülür. Göreli yolda yanlış klasöre bakmak, yeni başlayanların en sık karşılaştığı sorunlardan biridir.

Programın hangi klasörden çalıştığını ve göreli yolun nereye çözüldüğünü şu kodla görebilirsin:

import java.io.File;

public class CalismaKlasoru {
    public static void main(String[] args) {
        System.out.println("Çalışma klasörü: " + System.getProperty("user.dir"));

        File klasor = new File("belgeler");
        System.out.println("Mutlak yol: " + klasor.getAbsolutePath());
        System.out.println("Var mı? " + klasor.exists());
        System.out.println("Klasör mü? " + klasor.isDirectory());
    }
}

user.dir, Java'nın standart sistem özelliklerinden biridir ve kullanıcının çalışma klasörünü verir. İlk satırın çıktısı her bilgisayarda farklıdır. İkinci satır ise genellikle birinci satırdaki yolun sonuna belgeler eklenmiş hâlidir; yani Java göreli yolu çalışma klasörünün içinde arar. Son iki satır false yazıyorsa o konumda belgeler adında bir klasör yoktur.

Çalışma klasörü, programı nereden başlattığına bağlıdır. Bir IDE'den çalıştırdığında bu klasör çoğunlukla proje klasörü olur. Aynı programı terminalden başka bir klasördeyken başlatırsan çalışma klasörü değişir ve aynı "belgeler" yolu başka bir yere çözülür. Kod aynı kalsa bile sonucun farklı çıkmasının nedeni budur. Yolu yazmadan önce yukarıdaki kontrolü çalıştırmak bu karışıklığı baştan çözer.

File sınıfı, dizi ve döngü konularında kendini tam emin hissetmiyorsan ücretsiz Java bilgi testiyle hangi konuları pekiştirmen gerektiğini görebilirsin.

listFiles() ile klasörün içeriği nasıl alınır?

listFiles() ile klasörün içeriği nasıl alınır?

listFiles() metodu, File nesnesinin temsil ettiği klasörün içindekileri File[] türünde bir dizi olarak döndürür. Dizide hem dosyalar hem de alt klasörler bulunur; hepsi birer File nesnesidir. Temel kullanım şöyledir:

import java.io.File;

public class KlasorListele {
    public static void main(String[] args) {
        File klasor = new File("belgeler");
        File[] icerik = klasor.listFiles();

        if (icerik == null) {
            System.out.println("Klasör okunamadı ya da yol bir klasör değil.");
            return;
        }

        for (File oge : icerik) {
            System.out.println(oge.getName());
        }
    }
}

belgeler klasöründe not.txt, rapor.pdf ve resimler adlı bir alt klasör varsa program bu üç adı satır satır yazdırır. getName() yalnızca son bölümü, yani dosya ya da klasörün adını verir; tam yol için getAbsolutePath() kullanılır.

Adların hangi sırayla geleceğine güvenme. Javadoc, listFiles() sonucundaki elemanların belirli bir sırada olacağını garanti etmediğini belirtir. Sıralı bir çıktı istiyorsan diziyi kendin sıralaman gerekir.

null ile boş dizi aynı şey değildir

İki durumu birbirinden ayırmak önemlidir:

  • Boş klasör: uzunluğu 0 olan bir dizi döner. Hata değildir, döngü hiç çalışmadan geçer.
  • null: verilen yol bir klasörü göstermiyorsa ya da okuma sırasında bir giriş/çıkış hatası olduysa döner. Yol yanlışsa ya da klasöre erişilemiyorsa bu sonucu alırsın.

Yani listFiles() sonucu null olabilir; döngüden önce sonucu kontrol etmek gerekir. Bu kontrolü atlarsan şu olur:

File[] icerik = new File("olmayanKlasor").listFiles();

for (File oge : icerik) {   // icerik null olduğu için burada hata alınır
    System.out.println(oge.getName());
}

Yol bir klasöre çözülmediğinde icerik null olur ve gelişmiş for döngüsü başlarken program NullPointerException ile durur. Çözüm, ilk örnekteki gibi döngüden önce icerik == null kontrolünü eklemektir.

Dosya ile klasör nasıl ayrılır: isFile() ve isDirectory()

Dosya ile klasör nasıl ayrılır: isFile() ve isDirectory()

listFiles() dosyaları ve alt klasörleri aynı dizide döndürür. Her öğenin türünü File sınıfının iki metoduyla sorarsın: isDirectory() öğe klasörse, isFile() öğe normal bir dosyaysa true verir.

File[] ogeler = new File("belgeler").listFiles();

if (ogeler != null) {
    for (File oge : ogeler) {
        if (oge.isDirectory()) {
            System.out.println("[Klasör] " + oge.getName());
        } else if (oge.isFile()) {
            System.out.println("[Dosya] " + oge.getName());
        }
    }
}

Çıktıdaki satırlar [Klasör] arsiv ya da [Dosya] notlar.txt biçiminde olur. Satırların sırası sabit değildir; bunu sonraki bölümde sıralama ile çözeceğiz.

İki metot da false dönebilir. Normal bir dosya ya da klasör olmayan özel öğeler bu durumun örneğidir. Liste alındıktan sonra silinen bir öğe de aynı sonucu verir. Bu yüzden ikinci kontrolü else yerine else if (oge.isFile()) olarak yazmak daha dikkatli bir tercihtir.

Ada bakarak ayırmak neden güvenilmez?

"Adında nokta varsa dosyadır" varsayımı hatalıdır. yedek.txt adında bir klasör olabilir, uzantısız bir dosya da olabilir. Türü adından tahmin etme; dosya sistemine isFile() ve isDirectory() ile sor.

Yalnızca .txt dosyalarını listeleyen çalışan örnek

Aşağıdaki program belgeler klasörünü okur, adlara göre sıralar ve yalnızca .txt uzantılı dosyaları yazdırır. Klasörün içeriği şöyle olsun: notlar.txt, Rapor.TXT, resim.png, taslak.txt, yedek.txt adlı bir alt klasör ve arsiv adlı bir alt klasör.

import java.io.File;
import java.util.Arrays;
import java.util.Locale;

public class TxtListele {
    public static void main(String[] args) {
        File klasor = new File("belgeler");
        File[] ogeler = klasor.listFiles();

        if (ogeler == null) {
            System.out.println("Klasör okunamadı: belgeler");
            return;
        }

        Arrays.sort(ogeler);

        int sayac = 0;
        for (File oge : ogeler) {
            if (!oge.isFile()) {
                continue;
            }
            String ad = oge.getName();
            if (ad.toLowerCase(Locale.ROOT).endsWith(".txt")) {
                System.out.println(ad);
                sayac++;
            }
        }

        if (sayac == 0) {
            System.out.println("Bu klasörde .txt dosyası bulunamadı.");
        }
    }
}

Beklenen terminal çıktısı:

Rapor.TXT
notlar.txt
taslak.txt

resim.png uzantısı uymadığı için, arsiv ise klasör olduğu için listede yok. yedek.txt adı ".txt" ile bitiyor, ama bir klasör olduğundan isFile() kontrolünde elendi.

Satır satır açıklama

  • import satırları: File, Arrays ve Locale sınıflarını kullanıma açar.
  • File nesnesi: new File("belgeler") klasörü temsil eder; henüz diskten bir şey okumaz.
  • listFiles(): klasörün içindekileri File[] olarak verir.
  • null kontrolü: klasör yoksa ya da okunamıyorsa sonuç null olur. Program mesaj yazıp return ile çıkar.
  • Arrays.sort: listFiles() sıra garantisi vermez. Sıralama yol adına göre yapılır ve çıktı tutarlı olur.
  • isFile(): klasörleri ve özel öğeleri döngüden atar.
  • Uzantı filtresi: toLowerCase(Locale.ROOT) adı küçük harfe çevirir; böylece Rapor.TXT de eşleşir. Locale.ROOT yerel ayardan bağımsız çeviri sağlar. Türkçe ayarda büyük "I" harfi noktasız "ı" olur ve .ZIP gibi bir uzantı .zip ile eşleşmez.
  • sayac: hiç eşleşme yoksa kullanıcıya bilgi mesajı vermemizi sağlar.

Çıktıda Rapor.TXT'nin önce gelmesi, File karşılaştırmasının büyük harfi küçük harften önce koyduğu bir sistemde çalıştığımız içindir. Yol karşılaştırması büyük/küçük harfe duyarlı olmayan bir sistemde sıra notlar.txt, Rapor.TXT, taslak.txt olur. Sıralama kuralı sisteme göre değişir, bu yüzden çıktıda küçük bir sıra farkı görürsen hata yapmış olmazsın.

Aynı işi listFiles(FileFilter) ile de yapabilirsin. Bu yazıda döngü içinde filtre kullandık, çünkü her adım ayrı ayrı görünüyor.

null döndü ya da liste boş geldi: adım adım teşhis

İki durum birbirine karışır. null, yolun klasör olarak okunamadığı anlamına gelir. Boş dizi ise klasöre ulaşıldığını ama listelenecek bir şey bulunamadığını gösterir. Sırayla şu soruları sor:

  1. Yol doğru mu? getAbsolutePath() sonucunu yazdır. Göreli yol, programın gerçekte baktığı yeri ancak bu çıktıyla belli eder.
  2. exists() true mu? false ise o yolda ne dosya ne klasör vardır; ad ya da konum yanlıştır.
  3. isDirectory() true mu? Yol bir dosyaya işaret ediyorsa listFiles() null döndürür.
  4. canRead() true mu? Okuma izni yoksa içerik alınamayabilir.
  5. Çalışma klasörü beklediğin yer mi? Göreli yollar user.dir özelliğinin gösterdiği klasörden başlar. IDE ile terminalden çalıştırmak bu klasörü değiştirebilir.

Bu beş kontrolü tek seferde yazdıran küçük bir tanı kodu:

import java.io.File;

public class Teshis {
    public static void main(String[] args) {
        File klasor = new File("belgeler");
        System.out.println("Baktığı yer: " + klasor.getAbsolutePath());
        System.out.println("exists: " + klasor.exists());
        System.out.println("isDirectory: " + klasor.isDirectory());
        System.out.println("canRead: " + klasor.canRead());
        System.out.println("Çalışma klasörü: " + System.getProperty("user.dir"));
    }
}

Her şey yolundaysa üç kontrol de true yazar ve "Baktığı yer" satırı, "Çalışma klasörü" satırındaki yolun altındaki belgeler klasörünü gösterir. exists: false görürsen çoğunlukla çalışma klasörü beklediğin yer değildir; klasörü orada oluştur ya da programı doğru yerden başlat.

null gelmiyor ama dizi boşsa klasör gerçekten boştur ya da uyguladığın filtre hiçbir adı eşleştirmemiştir. Alt klasörlere inmek (özyineleme) ve java.nio.file paketindeki Files sınıfı bu yazının kapsamı dışında. Dosya sistemiyle çalışırken daha modern bir alternatif sunduğu için sıradaki konu olarak ona bakabilirsin.

Dosya işlemlerini kendi hızında, ödevlerle ve birebir geri bildirimle pekiştirmek istersen Java Özel Ders programı 36 derslik, Lise ve Üniversite öğrencilerine yönelik bir yapı sunar; dersler online ya da İzmir'de yüz yüze yapılır.

Bir klasörü listelerken sorun çıkarsa önce yolun gerçekte nereye baktığını gör, sonra klasör olup olmadığını ve okunabilirliğini kontrol et. Bu sıra çoğu hatayı birkaç satırda çözer.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara