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
FileWriteryerineBufferedWriterveBufferedReadersı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
StringBuilderkullanmak, 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-resourcesyapı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
NotDefteriExceptionsınıfınızı oluşturarak hataları kategorize edebilirsiniz. - Loglama Kütüphaneleri: Profesyonel projelerde
java.util.loggingveyaSLF4Jgibi 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.


Yorumlar (0)
Yorum Yaz