Gereksinimler ve Ön Hazırlık
Uygulamayı geliştirmek için bilgisayarınızda Java Development Kit (JDK) 21 veya üzeri bir sürümün yüklü olması önerilir. 2026 yılı itibarıyla modern Java projelerinde "LTS" (Long Term Support) sürümlerini tercih etmek, güvenlik ve performans açısından kritik öneme sahiptir.
- IDE: IntelliJ IDEA, Eclipse veya VS Code.
- JDK: JDK 21 veya 25 (LTS sürümleri).
- Bilgi: Temel Java sözdizimi, döngüler ve dosya işlemleri hakkında bilgi sahibi olmanız yeterlidir.
Proje Yapısı ve Temel Sınıf Tasarımı
Not defteri uygulamamızda iki temel yapı kullanacağız: Kullanıcıdan veri alan bir "Main" sınıfı ve dosya işlemlerini yöneten bir "NotYonetici" sınıfı. Bu ayrım, kodun okunabilirliğini ve sürdürülebilirliğini artırır.
// NotYonetici.java - Dosya işlemlerini yönetecek sınıfın iskeleti
import java.io.*;
import java.util.ArrayList;
public class NotYonetici {
private final String dosyaAdi = "notlar.txt";
public void notEkle(String icerik) {
// Dosyaya ekleme yapma mantığı buraya gelecek
}
}
Yukarıdaki kod, projemizin temel dosya yönetim sınıfını temsil eder. private final kullanımı, dosya adının uygulama boyunca değişmemesini garanti altına alır.
Kullanıcıdan Veri Alma ve Konsol Etkileşimi
Java'da konsoldan veri okumak için Scanner sınıfını kullanırız. Kullanıcıya bir menü sunarak uygulamanın etkileşimli olmasını sağlayacağız.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Not Defteri Uygulamasına Hoş Geldiniz!");
System.out.println("1. Not Ekle\n2. Notları Listele\n3. Çıkış");
int secim = scanner.nextInt();
scanner.nextLine(); // Buffer temizleme
}
}
Burada scanner.nextLine() kullanmamızın nedeni, nextInt() metodundan sonra kalan satır sonu karakterini temizleyerek bir sonraki metin girişinin hatalı olmasını engellemektir.
Dosyaya Not Yazma ve Hata Yönetimi
Notların kalıcı olması için FileWriter ve BufferedWriter sınıflarını kullanacağız. Dosya işlemleri sırasında oluşabilecek hataları try-catch blokları ile yönetmek, uygulamanın çökmesini engeller.
public void notEkle(String icerik) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(dosyaAdi, true))) {
writer.write(icerik);
writer.newLine();
System.out.println("Not başarıyla kaydedildi.");
} catch (IOException e) {
System.err.println("Dosya yazma hatası: " + e.getMessage());
}
}
try-with-resources yapısı, dosyanın işlem bittikten sonra otomatik olarak kapatılmasını sağlar. Bu, bellek sızıntılarını önlemek için modern Java'daki en iyi uygulamadır.
Dosyadan Notları Okuma ve Listeleme
Kaydedilen notları ekrana yazdırmak için BufferedReader sınıfını kullanırız. Bu sınıf, dosyayı satır satır okuyarak bellek kullanımını optimize eder.
public void notlariListele() {
try (BufferedReader reader = new BufferedReader(new FileReader(dosyaAdi))) {
String satir;
while ((satir = reader.readLine()) != null) {
System.out.println("- " + satir);
}
} catch (FileNotFoundException e) {
System.out.println("Henüz kayıtlı not bulunamadı.");
} catch (IOException e) {
System.err.println("Dosya okuma hatası.");
}
}
FileNotFoundException yakalanarak, dosya henüz oluşturulmamışsa kullanıcıya anlamlı bir mesaj verilmesi sağlanır.
Uygulama Yöntemleri Karşılaştırma Tablosu
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| BufferedWriter | Hızlı ve bellek dostu | Dosya kilitleme yönetimi gerektirir |
| Files.writeString | Kısa ve modern sözdizimi | Çok büyük dosyalarda performans düşebilir |
Güvenlik Uyarısı: Kullanıcıdan alınan metinleri dosyaya yazarken, dosya yolunun dışına çıkılmasını engelleyen "Path Traversal" saldırılarına karşı dikkatli olunmalıdır. Dosya isimlerini kullanıcıdan doğrudan almayın.
Sıkça Sorulan Sorular
Java'da neden Scanner yerine BufferedReader kullanmalıyım?
Scanner, küçük veri girişleri için kolaydır ancak büyük miktarda veri okurken BufferedReader çok daha hızlı ve performanslı çalışır.
Dosya neden her seferinde siliniyor?
new FileWriter(dosyaAdi, true) yapısındaki true parametresini unutursanız, Java dosyayı her seferinde yeniden oluşturur ve eski veriler silinir.
Notları şifreleyebilir miyim?
Evet, Java'nın javax.crypto kütüphanesini kullanarak notları yazmadan önce şifreleyebilir, okurken çözebilirsiniz.
Uygulamayı nasıl geliştiririm?
Notları silme, düzenleme veya tarih damgası ekleme gibi özellikler ekleyerek projenizi bir üst seviyeye taşıyabilirsiniz.
Hata yönetimi neden önemli?
Dosya sistemine erişim, izin sorunları veya disk dolu olması gibi beklenmedik durumlar nedeniyle başarısız olabilir; bu yüzden try-catch blokları zorunludur.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Ticari veya kritik sistemlerde dosya izinleri, veri şifreleme ve gelişmiş hata yönetimi süreçlerini profesyonel standartlarda yapılandırmanız gerekir.
Uygulama Performansını Artırmak İçin İleri İpuçları
Not defteri uygulamanız büyüdükçe, dosya okuma ve yazma işlemlerinde performans darboğazları yaşanabilir. Özellikle binlerce notun olduğu bir dosyada, her seferinde tüm veriyi belleğe yüklemek yerine, sadece ihtiyaç duyulan satırlara odaklanmak sistem kaynaklarını daha verimli kullanmanızı sağlar.
Buffered I/O Kullanımının Avantajları
Java'da dosya işlemleri yaparken Scanner sınıfı yerine BufferedReader ve BufferedWriter kullanmak, disk erişim sayısını azaltarak okuma/yazma hızını ciddi oranda artırır. Aşağıdaki örnekte, büyük dosyalar üzerinde daha hızlı işlem yapmanızı sağlayacak optimize edilmiş bir yazma yöntemi gösterilmiştir:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class NotKaydedici {
public void notuHizliKaydet(String dosyaAdi, String icerik) {
// BufferedWriter ile tampon bellek kullanarak yazma işlemi
try (BufferedWriter writer = new BufferedWriter(new FileWriter(dosyaAdi, true))) {
writer.write(icerik);
writer.newLine();
} catch (IOException e) {
System.err.println("Dosya yazma hatası: " + e.getMessage());
}
}
}
Uygulama İçin Birim Testleri Oluşturma
Kodunuzun doğruluğunu manuel olarak test etmek yerine, JUnit gibi kütüphaneler kullanarak otomatik test süreçleri oluşturmalısınız. Bu, özellikle not silme veya güncelleme gibi kritik fonksiyonlarda hata yapmanızı engeller.
Örnek Bir Test Senaryosu
Aşağıdaki yapı, notun dosyaya başarıyla yazılıp yazılmadığını kontrol eden basit bir test mantığını temsil eder:
import org.junit.Test;
import static org.junit.Assert.*;
import java.io.File;
public class NotDefteriTest {
@Test
public void testDosyaOlusturma() {
File dosya = new File("test_not.txt");
// Dosyanın oluşturulup oluşturulmadığını doğrula
assertTrue(dosya.exists() || dosya.length() >= 0);
}
}
Dağıtım (Deployment) Öncesi Kontrol Listesi
Uygulamanızı bir JAR dosyası haline getirip başkalarıyla paylaşmadan önce şu adımları gözden geçirdiğinizden emin olun:
- Dosya Yolları: Dosya yollarını sabit kodlamak (hard-coded) yerine, kullanıcının çalışma dizinini (
System.getProperty("user.dir")) dinamik olarak alın. - Karakter Kodlaması: Türkçe karakter sorunlarını önlemek için dosya okuma/yazma işlemlerinde
StandardCharsets.UTF_8kullanın. - Kaynak Yönetimi:
try-with-resourcesyapısını kullanarak tüm dosya akışlarının (streams) işlem sonunda otomatik kapandığından emin olun.
Sonuç
Bu rehberde, Java ile konsol üzerinden çalışan bir not defteri uygulamasının temel adımlarını tamamladık. Dosya okuma/yazma, kullanıcı girişi ve hata yönetimi konularını pratik ettiniz. Bir sonraki adım olarak, notlara kategori ekleyebilir veya verileri bir veritabanında (SQLite gibi) saklayarak uygulamanızı daha profesyonel hale getirebilirsiniz.


Yorumlar (0)
Yorum Yaz