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ı
| Metot | Gö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)
- 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.
- 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.
- 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.
- 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.
- 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.