Scanner Sınıfı
Scanner, Java'da metin girdisini okuyup parçalara ayırmanın en pratik yoludur. Klavyeden kullanıcı girdisi almak, bir dosyayı satır satır işlemek veya bir metni belirteçlere (token) ayırmak için kullanılır. Tek bir sı…
Scanner Sınıfı
Scanner, Java'da metin girdisini okuyup parçalara ayırmanın en pratik yoludur. Klavyeden
kullanıcı girdisi almak, bir dosyayı satır satır işlemek veya bir metni belirteçlere (token)
ayırmak için kullanılır. Tek bir sınıfla hem ham metni hem de sayı/boolean gibi tipleri okuyabilmen,
onu öğrenirken ilk karşılaşılan araçlardan biri yapar.
Kaynak ve tip tip okuma
Scanner herhangi bir kaynaktan okuyabilir: System.in (klavye), File, String. Girdiyi
varsayılan olarak boşluklara göre belirteçlere böler ve her belirteci istenen tipte okur:
Scanner sc = new Scanner("Ada 30 175.5 true"); String ad = sc.next(); // "Ada" int yas = sc.nextInt(); // 30 double boy = sc.nextDouble(); // 175.5 boolean uye = sc.nextBoolean();// true
Metotlar: next() (bir belirteç), nextInt(), nextLong(), nextDouble(), nextBoolean(),
nextLine() (tüm satır). Örnek 1 (./Ornek1.java) tip tip okumayı ve güvenli okumayı gösterir.
Güvenli okuma: hasNextX()
Bir belirteci yanlış tiple okumaya çalışmak InputMismatchException atar. Bu yüzden okumadan
önce kontrol et:
while (sc.hasNext()) { if (sc.hasNextInt()) toplam += sc.nextInt(); // sayıysa al else sc.next(); // değilse atla }
hasNext(), hasNextInt(), hasNextLine() gibi metotlar, kaynakta uygun veri olup olmadığını
okumadan söyler — döngülerin ve doğrulamanın temelidir.
Satır okuma ve özel ayraç
nextLine(): Satır sonuna kadar olan tüm metni okur (içindeki boşluklar dahil).useDelimiter(regex): Belirteç ayracını değiştirir. Örneğin virgülle ayrılmış (CSV) veriyi okumak içinuseDelimiter(",").
Örnek 2 (./Ornek2.java) satır satır okumayı, CSV ayracını ve aşağıdaki klasik tuzağı gösterir.
Klasik tuzak: nextInt() sonrası nextLine()
En sık yapılan hata: nextInt()/nextDouble(), okuduğu sayıdan sonraki satır sonunu (\n)
tüketmez. Hemen ardından nextLine() çağırırsan, o boş kalan satır sonunu okur (boş string döner):
int sayi = sc.nextInt(); sc.nextLine(); // <-- bırakılan satır sonunu TÜKET String isim = sc.nextLine(); // şimdi doğru satırı okur
Çözüm: araya fazladan bir nextLine() koymak (veya tüm girdiyi nextLine() ile okuyup elle
ayrıştırmak).
Kaynak kapatma
Scanner bir kaynağı sarar; işin bitince close() çağır (özellikle File kaynaklarında).
try-with-resources ile otomatik kapatabilirsin: try (Scanner sc = new Scanner(dosya)) { ... }.
(System.in'i saran Scanner'ı kapatmak System.in'i de kapatır; ona dikkat.)
Alternatifler
BufferedReader: Büyük dosyaları satır satır okumadaScanner'dan daha hızlıdır (readLine()).String.split(regex): Elindeki bir metni hızlıca parçalara ayırmak için.Files.lines(path): Bir dosyayı satır akışı (Stream) olarak okumak için.
Özet
Scanner ile metni belirteçlere ayırıp tip tip okumayı (Örnek 1); hasNextX() ile güvenli
okumayı, satır okuma ve özel ayraçları, ve nextInt/nextLine tuzağını (Örnek 2) öğrendik. Klavye
girdisi ve basit metin/dosya ayrıştırma için ideal; büyük dosyalarda BufferedReader/Files.lines
tercih edilir. Sırada en çok kullanılan koleksiyon: ArrayList.
▶ Kod Örnekleri(2)
Ornek1
çalıştırılabilir1// Ornek1: Scanner — metni parçalara ayırıp tip tip okumak.
2// (Portal etkileşimsiz çalışır; bu yüzden System.in yerine bir String'i kaynak alıyoruz.
3// Gerçek uygulamada: new Scanner(System.in) ile klavyeden okunur — README'ye bak.)
4// Çalıştırma: java Ornek1.java
5import java.util.Scanner;
6
7public class Ornek1 {
8
9 public static void main(String[] args) {
10 // Scanner herhangi bir kaynaktan okuyabilir: System.in, File, String...
11 String girdi = "Ada 30 175.5 true";
12 Scanner sc = new Scanner(girdi);
13
14 // Boşlukla ayrılmış belirteçleri (token) TİPİNE göre oku:
15 String ad = sc.next();
16 int yas = sc.nextInt();
17 double boy = sc.nextDouble();
18 boolean uyeMi = sc.nextBoolean();
19 System.out.printf("ad=%s, yas=%d, boy=%.1f, uye=%b%n", ad, yas, boy, uyeMi);
20 sc.close();
21
22 // hasNextX() ile güvenli okuma: tip uymazsa atla/yönet.
23 Scanner sc2 = new Scanner("10 abc 20 xyz 30");
24 int toplam = 0;
25 while (sc2.hasNext()) {
26 if (sc2.hasNextInt()) toplam += sc2.nextInt(); // sayıysa topla
27 else sc2.next(); // değilse atla
28 }
29 System.out.println("Sadece sayıların toplamı: " + toplam);
30 sc2.close();
31
32 System.out.println("""
33
34 --- Scanner ---
35 Bir kaynaktan (System.in, File, String) okuyup belirteçlere ayırır.
36 nextInt/nextDouble/next/nextLine/nextBoolean ile tip tip okunur; varsayılan ayraç boşluktur.
37 hasNextInt()/hasNext() ile okumadan ÖNCE kontrol et (tip uyuşmazlığı InputMismatchException atar).
38 Klavyeden okuma: Scanner sc = new Scanner(System.in); int x = sc.nextInt();""");
39 }
40}Ornek2
çalıştırılabilir1// Ornek2: Scanner — satır okuma, özel ayraç (delimiter) ve nextInt/nextLine tuzağı.
2// Çalıştırma: java Ornek2.java
3import java.util.Scanner;
4
5public class Ornek2 {
6
7 public static void main(String[] args) {
8 // 1) Satır satır okuma: nextLine() + hasNextLine()
9 String metin = "birinci satır\nikinci satır\nüçüncü satır";
10 Scanner sc = new Scanner(metin);
11 int no = 1;
12 while (sc.hasNextLine()) {
13 System.out.println(no++ + ": " + sc.nextLine());
14 }
15 sc.close();
16
17 // 2) Özel ayraç: virgülle ayrılmış değerleri (CSV) oku
18 Scanner csv = new Scanner("elma,armut,kiraz,muz").useDelimiter(",");
19 System.out.print("\nCSV: ");
20 while (csv.hasNext()) System.out.print("[" + csv.next() + "] ");
21 System.out.println();
22 csv.close();
23
24 // 3) KLASİK TUZAK: nextInt()'ten sonra nextLine() boş satır döndürür.
25 Scanner t = new Scanner("42\nAda Yılmaz");
26 int sayi = t.nextInt();
27 t.nextLine(); // <-- nextInt'in bıraktığı satır sonunu TÜKET
28 String isim = t.nextLine(); // şimdi doğru satırı okur
29 System.out.println("\nTuzak çözümü -> sayi=" + sayi + ", isim=" + isim);
30 t.close();
31
32 System.out.println("""
33
34 --- Satır okuma, ayraç ve tuzak ---
35 nextLine(): satır sonuna kadar olan TÜM metni okur (boşluklar dahil).
36 useDelimiter(regex): belirteç ayracını değiştirir (örn. ',' ile CSV).
37 TUZAK: nextInt()/nextDouble() satır sonunu (\\n) BIRAKIR; hemen sonra nextLine()
38 gelirse o boş kalan satırı okur. Çözüm: arada fazladan bir nextLine() çağır.""");
39 }
40}