Eğitim Portalı/Java/Scanner Sınıfı
Java01-java/46-scanner

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çin useDelimiter(",").

Ö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 okumada Scanner'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ılabilir
Ornek1.java
1// 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}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.

Ornek2

çalıştırılabilir
Ornek2.java
1// 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}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.