İçeriğe geç

Menü

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

Java Dosyaya Yazma ve Dosyadan Okuma Nasıl Yapılır?

java-dosyaya-yazma-ve-dosyadan-okuma-nasil-yapilir
Bu yazıda neler var?
  1. Java dosya işlemlerinde hangi API ne zaman seçilir?
  2. Path, çalışma dizini ve karakter kodlaması nasıl yönetilir?
  3. Files.writeString() ve Files.readString() nasıl kullanılır?
  4. Çalışan bir Java not uygulaması nasıl yazılır?
  5. Dosya bulunamadı hatası nasıl adım adım teşhis edilir?
  6. Sık Sorulan Sorular

Java dosyaya yazma ve dosyadan okuma işlemleri için kısa bir metin dosyasının tamamını işlemek istiyorsan Path ile Files.writeString() ve Files.readString() yöntemlerini kullanabilirsin. Satır satır ilerlemek gerektiğinde ise Files.newBufferedReader() ile BufferedReader tercih edilir.

Sağlıklı bir uygulama için dosya yolunu çalışma diziniyle birlikte netleştirmek, karakter kodlamasını açıkça belirtmek ve oluşan IOException durumunda yol sorunuyla erişim izni sorununu ayrı ayrı incelemek gerekir. Böylece dosyaya yazma veya dosyadan okuma sırasında oluşan hataları daha kolay teşhis edebilirsin.

Java dosya işlemlerinde hangi API ne zaman seçilir?

Kısa bir metni tek seferde yazmak için Files.writeString(path, text, charset), dosyanın tüm içeriğini bir String olarak almak için Files.readString(path, charset) uygundur. Karakter kodlamasını belirtmediğin kısa imzalarda UTF-8 kullanılır. Yazma çağrısında ek bir açma seçeneği vermezsen dosya yoksa oluşturulur, mevcut dosyanın içeriği yazma işlemi öncesinde değiştirilir. Bu yöntemler dosya işlemiyle ilgili sorunlarda IOException bildirebilir.

Dosyayı satır satır okumak, her satır üzerinde ayrı işlem yapmak veya okuma akışını kendin yönetmek istediğinde Files.newBufferedReader() kullanabilirsin. Bu metot belirtilen karakter kodlamasıyla bir BufferedReader döndürür. BufferedReader açık bir kaynak olduğu için try-with-resources yapısının içine alınmalıdır. Böylece okuma tamamlandığında veya hata oluştuğunda kaynak kapatılır. readLine() satır sonu karakterlerini döndürmeden bir satır okur, dosyanın sonuna gelindiğinde null verir ve okuma hatalarında IOException oluşturabilir.

Files.readString() ve Files.writeString() gibi tek çağrılı yöntemlerde sana açık bir reader veya writer nesnesi dönmez. Bu nedenle ayrıca kapatacağın bir kaynak oluşturmazsın. Buna karşılık BufferedReader elde ettiğinde kaynak yönetimi senin kodunun sorumluluğundadır. Yol, istisnalar ve temel Java sözdizimi bilgini uygulamalı olarak ölçmek için Java bilgi testini çözebilirsin.

Path, çalışma dizini ve karakter kodlaması nasıl yönetilir?

Path, çalışma dizini ve karakter kodlaması nasıl yönetilir?

Path.of("notlar.txt") gibi bir ifade göreli yol oluşturur. Göreli yol, kendi başına tam bir konum belirtmediği için çalışma dizini bağlamında değerlendirilir. Varsayılan dosya sisteminde bu çalışma dizini, user.dir sistem özelliğiyle ilişkilidir. Programı farklı bir konumdan çalıştırdığında aynı göreli yol farklı bir dosyayı gösterebilir. Kullanılan gerçek yolu görmek için toAbsolutePath() çağrısını kullanabilirsin.

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;

public class DosyaOrnegi {
    public static void main(String[] args) throws IOException {
        Path dosya = Path.of("notlar.txt");

        System.out.println("Kullanılan yol: " + dosya.toAbsolutePath());

        Files.writeString(
                dosya,
                "Bugün Path ve Files çalıştım.n",
                StandardCharsets.UTF_8
        );

        String icerik = Files.readString(
                dosya,
                StandardCharsets.UTF_8
        );

        System.out.print(icerik);
    }
}

Beklenen çıktı: İlk satırda çalıştırma ortamına göre değişen mutlak dosya yolu, sonraki satırda Bugün Path ve Files çalıştım. metni görünür. StandardCharsets.UTF_8 hem yazma hem okuma çağrısında kullanıldığı için iki işlem aynı karakter kodlamasıyla yapılır. UTF_8, Java platformunda standart ve kullanılabilir karakter kodlamalarından biridir.

Bu örnek çalışmazsa önce ekrana yazdırılan mutlak yolu incele: dosya adı ve klasör doğru mu? Yol doğru olduğu hâlde işlem başarısızsa okuma veya yazma erişim izinlerini ayrıca kontrol et. Böylece yanlış dosyaya yönelme sorunuyla doğru dosyaya erişememe sorununu birbirine karıştırmazsın.

Files.writeString() ve Files.readString() nasıl kullanılır?

Files.writeString() ve Files.readString() nasıl kullanılır?

Metin dosyasının tamamını tek işlemde kaydetmek için Files.writeString(), tamamını tek bir String olarak almak için Files.readString() kullanabilirsin. Türkçe karakterlerin doğru okunup yazılması için karakter kodlamasını açıkça StandardCharsets.UTF_8 olarak belirtmek iyi bir pratiktir. Yöntemlerin imzalarını ve açma seçeneklerini Java SE Files API belgelerinde inceleyebilirsin.

Path dosya = Path.of("notlar.txt");

try {
    Files.writeString(
            dosya,
            "Bugün Java çalıştım.",
            StandardCharsets.UTF_8
    );

    String metin = Files.readString(
            dosya,
            StandardCharsets.UTF_8
    );

    System.out.println(metin);
} catch (IOException e) {
    System.out.println("Dosya işlemi başarısız: " + e.getMessage());
}

Yazma seçeneği verilmediğinde dosya yoksa oluşturulur, varsa mevcut içerik değiştirilerek yeni metin yazılır. İçeriği koruyup sona eklemek için StandardOpenOption.CREATE ve StandardOpenOption.APPEND seçeneklerini kullanabilirsin. Files.readString() ise dosyanın tamamını, satır sonlarıyla birlikte tek bir metin olarak döndürür ve okuma işlemi tamamlandığında dosyayı kapatır. Her iki yöntem de dosya işlemi başarısız olduğunda IOException oluşturabileceği için try ve catch ile yönetilmelidir.

Satır satır okuma gerektiğinde

Dosyanın tamamını tek bir metin olarak almak yerine her satırı ayrı işlemek istediğinde Files.newBufferedReader() ile BufferedReader oluşturabilirsin.

try (BufferedReader okuyucu =
         Files.newBufferedReader(dosya, StandardCharsets.UTF_8)) {

    String satir;
    while ((satir = okuyucu.readLine()) != null) {
        System.out.println(satir);
    }
} catch (IOException e) {
    System.out.println("Dosya okunamadı: " + e.getMessage());
}

Buradaki try-with-resources yapısı, BufferedReader nesnesinin blok sona erdiğinde otomatik olarak kapanmasını sağlar. readString() dosya kaynağını kendi yönettiği için ayrıca okuyucu kapatman gerekmez. newBufferedReader() ise doğrudan bir okuyucu döndürdüğünden, kaynak yönetimini try-with-resources ile yapmalısın.

Çalışan bir Java not uygulaması nasıl yazılır?

Aşağıdaki tek sınıflık uygulama, göreli notlar.txt yolunu kullanır. Dosya varsa mevcut notu okur ve ekrana yazdırır. Dosya yoksa başlangıç mesajı gösterir, örnek notu UTF-8 kodlamasıyla kaydeder.

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;

public class NotUygulamasi {
    public static void main(String[] args) {
        Path dosya = Path.of("notlar.txt");

        try {
            if (Files.exists(dosya)) {
                String mevcutNot =
                        Files.readString(dosya, StandardCharsets.UTF_8);

                System.out.println("Kayıtlı not:");
                System.out.println(mevcutNot);
            } else {
                String ornekNot =
                        "Java dosya işlemlerinde UTF-8 kullanıyorum.";

                System.out.println("Kayıtlı not bulunamadı.");
                Files.writeString(
                        dosya,
                        ornekNot,
                        StandardCharsets.UTF_8
                );
                System.out.println("Örnek not kaydedildi.");
            }
        } catch (IOException e) {
            System.out.println(
                    "Dosya işlemi başarısız: " + e.getMessage()
            );
        }
    }
}

İlk çalıştırmada dosya bulunmadığı için örnek not kaydedilir. Programı tekrar çalıştırdığında aynı dosya bulunur ve içeriği okunur.

İlk çalıştırma:
Kayıtlı not bulunamadı.
Örnek not kaydedildi.

Sonraki çalıştırma:
Kayıtlı not:
Java dosya işlemlerinde UTF-8 kullanıyorum.

Path.of("notlar.txt") göreli bir yol oluşturur. Bu nedenle dosya, kaynak kodun bulunduğu klasörde değil, Java programının çalışma dizininde oluşur. Çalışma dizini, programı başlattığın ortama göre değişebilir. IOException mesajı ise dosyanın okunamadığı veya yazılamadığı durumlarda ilk hata ipucunu verir.

Çalıştırmadan önce üç kontrol

  • Tüm okuma ve yazma çağrılarında aynı StandardCharsets.UTF_8 kodlamasını kullan.
  • Göreli yol kullandıysan notlar.txt dosyasını çalışma dizininde ara.
  • Satır satır okuyucular için try-with-resources, diğer dosya işlemleri için IOException yönetimi kullan.

Dosya bulunamadı hatası nasıl adım adım teşhis edilir?

Java’da dosya bulunamadı hatasını teşhis ederken sırayı bozmamak önemlidir: önce programın çözdüğü mutlak yolu, sonra dosya adı ve dosya türünü, en son okuma veya yazma yetkisini kontrol et. Göreli yolu görünür hâle getirmek için Path.toAbsolutePath(), dosya durumunu incelemek için Files.exists(), Files.isRegularFile(), Files.isReadable() ve Files.isWritable() kullanılabilir. Bu ön kontroller sonraki erişimin kesinlikle başarılı olacağını garanti etmez. NoSuchFileException bulunmayan dosyaya erişim denendiğini, AccessDeniedException ise erişim kontrolünün reddedildiğini gösterebilir. IOException mesajını yapılan işlem ve mutlak yol ile birlikte değerlendir.

import java.nio.file.Files;
import java.nio.file.Path;

public class DosyaKontrol {
    public static void main(String[] args) {
        Path dosya = Path.of("notlar.txt");

        System.out.println("Aranan yol: " + dosya.toAbsolutePath());
        System.out.println("Var mı: " + Files.exists(dosya));
        System.out.println("Normal dosya mı: " + Files.isRegularFile(dosya));
    }
}

Beklenen çıktı çalıştırma ortamına göre değişir. İlk satır mutlak yolu, sonraki iki satır ise true veya false değerlerini gösterir. Dosya mevcut ve normal dosyaysa son iki değer true olur.

  1. Çalışma dizini ve yol: Göreli bir yolun hangi klasöre göre çözüldüğünü varsayma. path.toAbsolutePath() ile programın gerçekten baktığı konumu yazdır. Çıkan yol beklediğin klasör değilse sorun çalışma dizini kaynaklı olabilir.
  2. Dosya adı ve varlığı: Dosya adını, uzantıyı ve büyük-küçük harfleri kontrol et. Ardından Files.exists(path) ile varlık kontrolü yap. Okunacak öğenin klasör değil normal dosya olması gerekiyorsa Files.isRegularFile(path) sonucunu da incele. exists() sonucunun false olması, dosyanın bulunamadığı veya durumun belirlenemediği anlamına gelebileceği için izin adımını atlama.
  3. Klasör ve erişim izinleri: Var olan dosyayı okumak için dosyanın okunabilirliğini, üzerine yazmak için yazılabilirliğini ayrı kontrol et. Yeni dosya oluşturuyorsan dosyanın bulunduğu klasördeki okuma ve yazma yetkilerini de ayrıca incele. Files.isReadable() ve Files.isWritable() ön kontrol sağlar. Yol hatasını izin hatısıyla aynı sorun gibi ele alma; istisna türüne, mesajına ve ilgili dosya yoluna bak.

Bu üç adımı düzenli Java pratiğiyle geliştirmek için birebir Java Özel Ders programını inceleyebilirsin.

Sık Sorulan Sorular

Göreli yol neden beklediğim klasör yerine başka bir konumda dosya arıyor?

Göreli yol, kaynak dosyanın klasörüne değil, Java sürecinin çalışma dizinine göre çözülür. IDE veya terminal bu dizini değiştirebilir. Path.toAbsolutePath() ile hedefi yazdırıp çalıştırma ayarındaki dizini kontrol et.

Files.writeString() kullanıldığında dosyanın önceki içeriği korunur mu?

Varsayılan açma seçenekleriyle hayır. Mevcut normal dosya önce kesilir, ardından yeni metin yazılır. Eski içeriğin sonuna eklemek için StandardOpenOption.APPEND seçeneğini açıkça kullanmalısın.

BufferedReader neden try-with-resources ile kullanılmalı?

BufferedReader kapatılması gereken bir kaynaktır. try-with-resources bloğu, okuma sırasında hata oluşsa bile kaynağın otomatik kapanmasını sağlar ve işletim sistemi kaynaklarının açık kalma riskini azaltır.

Dosya yolu doğru olduğu hâlde neden erişim izni hatası alınabilir?

Yol doğru olsa da Java sürecinin dosyayı okuma veya yazma yetkisi olmayabilir. Dosyanın kendisini ve üst klasörünü ayrı kontrol et; Files.isReadable() ve Files.isWritable() sonuçlarını istisna türü ve mesajıyla birlikte değerlendir. AccessDeniedException erişim kontrolünün reddedildiğini gösterir.

Mutlak yolu, dosyanın türünü ve izinlerini sırayla görünür kıldığında dosya işlemlerindeki hatayı rastgele değişiklikler yapmadan daraltabilirsin.

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