Java İle Konsol Üzerinden Basit Not Defteri Nasıl Yapılır?

Java İle Konsol Üzerinden Basit Not Defteri Nasıl Yapılır?
Java İle Konsol Üzerinden Basit Not Defteri Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce bilgisayarınızda Java Geliştirme Kiti'nin (JDK) yüklü olması gerekir. 2026 yılı itibarıyla en güncel LTS (Uzun Süreli Destek) sürümlerinden biri olan Java 21 veya üzerini kullanmanızı öneririm. Geliştirme ortamı olarak IntelliJ IDEA, Eclipse veya VS Code gibi modern bir IDE (Tümleşik Geliştirme Ortamı) tercih edebilirsiniz.

  • JDK 21 veya daha yeni bir sürüm.
  • Temel Java sözdizimi bilgisi (Değişkenler, Döngüler, Koşullu İfadeler).
  • Dosya sistemi (java.io ve java.nio paketleri) hakkında temel kavramlar.

Adım 1: Kullanıcıdan Veri Alma ve Temel Menü Yapısı

İlk adım olarak, kullanıcının uygulama ile etkileşime girmesini sağlayacak bir menü yapısı kurmalıyız. Java'da konsol girişi için Scanner sınıfı kullanılır. Aşağıdaki kod bloğu, kullanıcının seçim yapabileceği bir döngü yapısını göstermektedir.

import java.util.Scanner;

public class NotDefteri {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        boolean devam = true;

        while (devam) {
            System.out.println("1. Not Ekle\n2. Notları Listele\n3. Çıkış");
            int secim = scanner.nextInt();
            scanner.nextLine(); // Buffer temizleme

            if (secim == 3) {
                devam = false;
            }
        }
        scanner.close();
    }
}

Bu kodda, scanner.nextLine() kullanımı kritiktir. nextInt() metodundan sonra satır sonu karakteri tamponda (buffer) kaldığı için, bir sonraki girişin boş geçilmemesi adına bu temizleme işlemi yapılmalıdır.

Adım 2: Dosyaya Veri Yazma İşlemi

Notların kalıcı olması için verileri bir metin dosyasına kaydetmemiz gerekir. Java'da FileWriter ve BufferedWriter sınıfları bu iş için oldukça verimlidir. Dosyaya yazma işlemi sırasında oluşabilecek hataları yönetmek için try-with-resources bloğunu kullanacağız.

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public void notKaydet(String not) {
    try (BufferedWriter writer = new BufferedWriter(new FileWriter("notlar.txt", true))) {
        writer.write(not);
        writer.newLine();
    } catch (IOException e) {
        System.out.println("Dosya yazma hatası: " + e.getMessage());
    }
}

Burada FileWriter kurucusuna verilen true parametresi, dosyanın üzerine yazmak yerine mevcut içeriğin sonuna ekleme (append) yapmamızı sağlar.

Adım 3: Dosyadan Notları Okuma

Kaydedilen notları ekrana yazdırmak için Files.readAllLines veya BufferedReader kullanabiliriz. Modern Java yaklaşımları, dosya okuma işlemlerinde daha temiz bir sözdizimi sunar.

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

public void notlariListele() {
    try {
        List notlar = Files.readAllLines(Paths.get("notlar.txt"));
        for (String not : notlar) {
            System.out.println("- " + not);
        }
    } catch (IOException e) {
        System.out.println("Henüz not bulunamadı veya dosya okunamadı.");
    }
}

Bu yöntem, dosyadaki tüm satırları bir liste olarak döndürür ve döngü ile kolayca ekrana basmamızı sağlar.

Adım 4: Uygulamanın Birleştirilmesi ve Hata Yönetimi

Tüm parçaları bir araya getirerek, kullanıcının not ekleyip görüntüleyebileceği tam bir uygulama haline getirelim. Bu aşamada, kullanıcı girişlerinin doğruluğunu kontrol etmek ve beklenmedik durumları yönetmek önemlidir.

public static void main(String[] args) {
    NotDefteri uygulama = new NotDefteri();
    Scanner scanner = new Scanner(System.in);
    
    // Uygulama mantığı buraya entegre edilir
    System.out.println("Notunuzu girin:");
    String icerik = scanner.nextLine();
    uygulama.notKaydet(icerik);
}
Kritik Güvenlik Uyarısı: Dosya yolları ile çalışırken, kullanıcıdan alınan girdilerin doğrudan dosya yolu olarak kullanılmadığından emin olun. Bu durum "Path Traversal" saldırılarına yol açabilir. Her zaman dosya isimlerini kod içerisinde sabit tutun veya sıkı bir şekilde doğrulayın.

Yöntem Karşılaştırma Tablosu

Yöntem Avantajı Dezavantajı
FileWriter Basit ve hızlı Büyük dosyalarda performans düşebilir
Files.readAllLines Okunabilir ve temiz kod Çok büyük dosyaları belleğe yükleyebilir

Sıkça Sorulan Sorular

Notlarımı neden bir veritabanına değil de dosyaya kaydediyoruz?

Bu proje, Java'nın temel dosya I/O (Giriş/Çıkış) işlemlerini öğrenmeniz için tasarlandı. Daha karmaşık projelerde SQL veritabanları (SQLite, PostgreSQL) tercih edilmelidir.

Dosya bulunamadığında uygulama çöküyor, nasıl engellerim?

try-catch bloklarını kullanarak IOException hatasını yakalamalı ve kullanıcıya anlamlı bir hata mesajı dönmelisiniz.

Scanner sınıfı neden bazen hata veriyor?

Scanner sınıfı, giriş akışını (stream) kapatırsa tekrar açılmaz. Uygulamanın başında bir kez tanımlayıp tüm sınıflarda kullanmak en iyi pratiktir.

Uygulamayı nasıl daha profesyonel hale getirebilirim?

Notlara tarih damgası ekleyebilir veya notları silme/güncelleme özelliklerini geliştirebilirsiniz.

Bu projeyi bir .exe dosyasına dönüştürebilir miyim?

Evet, jpackage aracını kullanarak Java uygulamanızı işletim sistemine özel bir çalıştırılabilir dosyaya dönüştürebilirsiniz.

Uygulama İçin İleri Seviye Optimizasyon ve Performans İpuçları

Basit bir not defteri uygulaması, veri boyutu arttıkça bellek yönetimi ve dosya erişim hızı açısından bazı zorluklarla karşılaşabilir. Uygulamanızın daha performanslı çalışması için aşağıdaki stratejileri göz önünde bulundurabilirsiniz:

  • Buffered I/O Kullanımı: Dosya okuma ve yazma işlemlerinde FileWriter yerine BufferedWriter ve BufferedReader sınıflarını kullanmak, disk erişim sayısını azaltarak performansı önemli ölçüde artırır.
  • StringBuilder ile Bellek Yönetimi: Notları ekrana basarken veya birleştirirken sürekli String nesnesi oluşturmak yerine StringBuilder kullanmak, Garbage Collector üzerindeki yükü hafifletir.
  • Dosya Boyutu Kontrolü: Uygulamanızın çok büyük dosyalarla çalışması gerekiyorsa, dosyayı tamamen belleğe yüklemek yerine satır satır okuyan yöntemleri tercih edin.

Performans Artırıcı Kod Örneği

Aşağıdaki örnekte, BufferedReader kullanarak dosya okuma işleminin nasıl daha verimli hale getirilebileceğini görebilirsiniz:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class NotOkuyucu {
    public void notlariListele(String dosyaAdi) {
        try (BufferedReader br = new BufferedReader(new FileReader(dosyaAdi))) {
            String satir;
            while ((satir = br.readLine()) != null) {
                System.out.println(satir);
            }
        } catch (IOException e) {
            System.err.println("Dosya okunurken bir hata oluştu: " + e.getMessage());
        }
    }
}

Uygulama Hata Ayıklama ve Loglama Stratejileri

Geliştirme aşamasında hataları tespit etmek, uygulamanın kararlılığı için kritiktir. Sadece System.out.println kullanmak yerine, profesyonel bir hata ayıklama yaklaşımı benimsemelisiniz.

  • Try-With-Resources Kullanımı: Dosya akışlarını manuel kapatmak yerine, Java'nın try-with-resources yapısını kullanarak kaynak sızıntılarını (resource leaks) engelleyin.
  • Özel Exception Sınıfları: Kullanıcı hatalarını daha iyi yönetmek için kendi NotDefteriException sınıfınızı oluşturarak hataları kategorize edebilirsiniz.
  • Loglama Kütüphaneleri: Profesyonel projelerde java.util.logging veya SLF4J gibi kütüphaneleri kullanarak hataları bir log dosyasına yazmak, uygulamanın çalışma zamanındaki davranışlarını izlemenizi kolaylaştırır.

Kullanıcı Hatalarını Yönetme

Kullanıcı yanlış bir dosya yolu girdiğinde veya geçersiz bir karakter girdiğinde uygulamanın çökmesini önlemek için şu yapıyı kullanabilirsiniz:

public void notKaydet(String not, String dosyaAdi) throws IllegalArgumentException {
    if (not == null || not.trim().isEmpty()) {
        throw new IllegalArgumentException("Not içeriği boş olamaz!");
    }
    // Dosya yazma işlemleri buraya...
}

Bu yöntemler, uygulamanızı basit bir konsol aracından, hata toleransı yüksek ve genişletilebilir bir yazılım parçasına dönüştürmenize yardımcı olacaktır.

Sonuç

Java ile konsol üzerinden not defteri yapmak, dosya yönetimi ve kullanıcı etkileşimi konusunda temel bir yetkinlik kazanmanızı sağlar. Bu projede öğrendiğiniz Scanner, FileWriter ve Files sınıfları, Java dünyasındaki birçok uygulamanın temelini oluşturur. Bir sonraki adım olarak, notlarınızı bir veritabanında tutmayı öğrenmek için JDBC (Java Database Connectivity) konusuna göz atmanızı öneririm.

Sorumluluk Reddi: Bu makale eğitim amaçlıdır. Yazılan kodlar üretim ortamında kullanılmadan önce güvenlik testlerinden geçirilmeli ve gerekli hata yönetimi mekanizmalarıyla güçlendirilmelidir.
Bu yazıya tepkinizi paylaşın:
Mert Çelik

Kendin yap (DIY) projeleri ve ev içi bakım rehberleri üzerine içerik geliştiriyorum. Detaylı ve anlaşılır anlatım diliyle karmaşık işleri keyifli hale getiriyorum.

Yorumlar (0)

Yorum Yaz