Skip to main content

Java Scanner Sınıfı: Kullanıcı Girdilerini, Dosya Verilerini ve Regex Ayrıştırmalarını Yönetme 🚀

🚀 Bu Rehberde Ne Öğreneceksiniz?

Bu rehberde Java Scanner sınıfını kullanarak kullanıcıdan veri almayı,
dosya içeriklerini işlemeyi ve metinleri düzenli ifadeler (regex) ile ayrıştırmayı öğreneceksiniz.
Pratik örnekler, yaygın hatalar ve performans ipuçlarıyla Scanner’ı uzman gibi kullanabileceksiniz.


🧠 Scanner Sınıfı Nedir?

Scanner, java.util paketinde bulunan ve Java 1.5 sürümüyle gelen bir yardımcı sınıftır.
Amacı, veri kaynaklarını belirteçlere (token) ayırarak ilkel veri tiplerine (int, double, String vb.) dönüştürmektir.
Konsol, dosya veya sabit bir metin kaynağından gelen veriyi okur ve işler.


🔍 Scanner Sınıfı Nasıl Çalışır?

Scanner, girdi verisini tanımlanmış bir ayırıcı desene göre böler (varsayılan: boşluk karakteri).
Ardından next() metoduyla bu parçaları sırayla okuyarak işleme alır.

Kısaca:
1️⃣ Veriyi kaynak olarak tanımlar.
2️⃣ Ayırıcıyı belirler (gerekirse useDelimiter() ile).
3️⃣ hasNext() ile veri var mı kontrol eder.
4️⃣ next() veya nextLine() ile okur.
5️⃣ close() metodu ile sistem kaynağını kapatır.


⚙️ Önemli Scanner Metotları

MetotGörevi
useDelimiter(String p)Verinin hangi desenle ayrılacağını belirler.
hasNext()Okunacak yeni bir belirteç olup olmadığını döndürür.
next()Bir sonraki belirteci döndürür.
nextLine()Satırın tamamını okur.
close()Scanner’ı kapatarak sistem kaynaklarını serbest bırakır.

🪜 Adım Adım Scanner Kullanımı

1️⃣ Scanner Nesnesini Oluşturma

Kullanacağınız girdiye göre farklı kurucular vardır:

  • Konsol → new Scanner(System.in)
  • Dosya → new Scanner(new File("veri.txt"))
  • Dize → new Scanner("örnek veri")

2️⃣ Ayırıcı (Delimiter) ve Karakter Kümesini Ayarlama

sc.useDelimiter(System.getProperty("line.separator"));

🧠 Bu kod, satır sonunu ayırıcı yapar. Boşluklu girişlerde tek token olarak okuma sağlar.


3️⃣ Girdi Kontrolü ve Okuma


while (sc.hasNext()) {
System.out.println(sc.next());
}

🧠 hasNext() veri olup olmadığını kontrol eder, next() ise sıradaki girdiyi alır.


4️⃣ Kaynakları Serbest Bırakma


sc.close();

🧠 Scanner kapanmazsa sistem kaynaklarını boş yere meşgul eder.


💻 Kullanım Senaryoları

🧍‍♂️ 1. Kullanıcı Girdisini Okuma


Scanner sc = new Scanner(System.in);
System.out.println("Adınızı ve soyadınızı girin:");
String ad = sc.next();
System.out.println("Merhaba " + ad);
sc.close();

🧠 Yalnızca ilk kelime okunur çünkü Scanner boşluğu ayırıcı olarak görür.


🪶 2. Boşluklu Girdiler İçin Ayırıcı Değiştirme


Scanner sc = new Scanner(System.in);
sc.useDelimiter(System.getProperty("line.separator"));
System.out.println("Adınızı ve soyadınızı girin:");
String tamAd = sc.next();
System.out.println("Merhaba " + tamAd);
sc.close();

🧠 Bu yöntemle “Ayse Yilmaz” girdisi tek parça olarak okunur.


📁 3. Dosya Verilerini Okuma ve Ayrıştırma


package rabisu.cloud.veri;

import java.io.*;
import java.util.*;

public class DosyaIsleyici {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(new File("calisanlar.csv"));
sc.useDelimiter(System.getProperty("line.separator"));

List<Calisan> calisanlar = new ArrayList<>();
while (sc.hasNext()) {
calisanlar.add(ayracla(sc.next()));
}
sc.close();
System.out.println(calisanlar);
}

private static Calisan ayracla(String kayit) {
Scanner s = new Scanner(kayit);
s.useDelimiter(",");
Calisan c = new Calisan(s.nextInt(), s.next(), s.next());
s.close();
return c;
}
}

class Calisan {
int id; String ad; String pozisyon;
Calisan(int i, String a, String p){ id=i; ad=a; pozisyon=p; }
public String toString(){ return "Calisan[" + id + "," + ad + "," + pozisyon + "]"; }
}

📤 Çıktı:


[Calisan[1,Jane Doe,CEO], Calisan[2,Mary Ann,CTO], Calisan[3,John Lee,CFO]]

🔢 4. Regex (Düzenli İfade) Kullanımı


String veri = "1a2b345c67d8,9#10";
Scanner sc1 = new Scanner(veri);
sc1.useDelimiter("\\D"); // Rakam olmayan her şeyi ayırıcı yapar

while (sc1.hasNext()) {
System.out.println(sc1.next());
}
sc1.close();

📤 Çıktı:

1
2
345
67
8
9
10

💬 Sıkça Sorulan Sorular (SSS)

  1. Scanner neden “kaynak yoğun” olarak bilinir?

Her Scanner örneği açık bir giriş akışı kullanır. Kapatan close() çağrısı yapılmazsa bellek ve dosya kilitleri oluşabilir.

  1. next() ile nextLine() farkı nedir?

next() yalnızca ilk boşluğa kadar okur. nextLine() satırın tamamını döndürür ve bir sonraki satıra geçer.

  1. BufferedReader mı yoksa Scanner mı?

Büyük dosyalarda BufferedReader daha hızlıdır. Ancak Scanner, veri ayrıştırma (tokenization) ve tiplere dönüştürme açısından daha esnektir.

  1. CSV dosyaları için Scanner yeterli mi?

Küçük CSV dosyaları için evet. Büyük dosyalar için OpenCSV veya java.nio.file daha uygundur.

  1. Regex ile hangi tür veriler okunabilir?

Rakam, harf, özel karakter ya da özel desenlere göre veri parçalama yapılabilir.


🏁 Sonuç

Java Scanner sınıfı, kullanıcı girdilerini, dosya verilerini ve metin içeriklerini hızlıca ayrıştırmak için güçlü ve pratik bir çözümdür. Gelişmiş ayırıcılar, düzenli ifadeler ve farklı kurucular sayesinde birçok senaryoda kolayca kullanılabilir.

💡 İpucu: Gerçek projelerde Scanner sınıfını, try-with-resources yapısıyla kullanarak kaynak yönetimini otomatik hale getirin.

☁️ Bu teknikleri Rabisu Bulut platformunda geliştirip test ederek Java uygulamalarınızda verimliliği artırabilirsiniz.