Wie kann man mit Hilfe der Klasse Scanner von der Konsole oder aus einer Datei lesen? v.5.0

Die Klasse Scanner stellt seit Java 5 eine Reihe Methoden bereit, mit denen man numerische und nicht-numerische Literale aus Strings, Dateien und Eingabe-Strömen (InputStream) einlesen und mit Hilfe von regulären Ausdrücken filtern kann.

Das erste Beispiel demonstriert das Einlesen von der Konsole. Es gibt so lange die auf der Kommandozeile eingegebenen und mit <Return> abgeschlossenen Strings aus, bis ein 'q' eingegeben wurde.
Hierzu wird dem Konstruktor des Scanner -Objektes der Eingabe-Strom System.in übergeben. In einer Endlosschleife wird durch die Methode next() der String übernommen und auf die o.a. Abbruchbedingung geprüft. Ist diese erfüllt, so wird die Schleife verlassen, ein Gruß ausgegeben und das Programm beendet. Im anderen Fall läuft die Schleife weiter und die Eingabe wird ausgegeben. Wichtig ist, dass der Scanner zum Schluss geschlossen wird.

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ScannerExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (true){
            String s = scanner.next();
            if(s.equals("q")) break;
            System.out.println(s);
        }
        System.out.println("Bye...");
        scanner.close();
    }
}

Das zweite Beispiel zeigt wie Scanner aus einer Datei liest und dabei zwischen numerischen und nicht numerischen Werten unterscheiden kann.
Hierzu muss dem Scanner -Objekt ein File -Objekt übergeben werden. Dies erhält seinerseits den Pfad zur Datei als String . Als zweiter, optionaler Parameter kann ein String des Zeichensatzes der Datei übergeben werden.
Scanner deklariert die Methode hasNext() . Sie liefert so lange true wie weitere Elemente ausgelesen werden können und lässt sich somit als Abbruchbedingung in einer while -Schleife einsetzen, die den Inhalt der Datei elementweise ausgibt.
'Elemente' sind in der Standardeinstellung durch Leerzeichen voneinander getrennte Zeichen.
Scanner kennt eine ganze Reihe teilweise überladener hasNextXX() -Methoden. XX gibt hierbei verschiedene Datentypen an, auf deren Folge-Existenz die Methoden prüfen können. Sie liefern ebenfalls boolsche Werte, die im Beispiel als Filter eingesetzt werden. Die Methode hasNextInt() prüft hierbei auf Integer-Werte, die durch nextInt() ermittelt und dann incrementiert und ausgegeben werden. Ähnlich verhält es sich mit hasNextDouble() . Trifft kein der beiden Bedingungen zu, so wird das Element als String behandelt.

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Locale;
import java.util.Scanner;

public class ScannerExample {

    public static void main(String[] args) {
        Scanner scanner;
        try {
            scanner = new Scanner(new File("test.txt"),
                    "UTF-8");
            scanner.useLocale(Locale.GERMANY);
            int i;
            double d;
            while (scanner.hasNext()) {
                if (scanner.hasNextInt()) {
                    i = scanner.nextInt();
                    System.out.println("Int: " + ++i);
                }else if (scanner.hasNextDouble()) {
                    d = scanner.nextDouble();
                    System.out.println("Double: " + ++d);
                } else {
                    System.out.println("String: " + scanner.next());
                }
            }
            scanner.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

Enthält die ausgelesene Datei den folgenden Eintrag

1 071 1.23 Dies 0xF3 ist 1,4 ein Test

so zeigt das Ergebnis:

Int: 2
Int: 72
String: 1.23
String: Dies
String: 0xF3
String: ist
Double: 2.4
String: ein
String: Test

Hieran lässt sich zweierlei gut erkennen:
Zum einen werden andere als dezimale Integer-Werte nicht automatisch als solche erkannt. Dies kann auch nicht innerhalb der Methoden hasNextInt(int radix) und nextInt(int radix) durch die Angabe von radix erreicht werden, da diese lediglich die erkannten Integer entsprechend bewerten, auf die Erkennung jedoch keinen Einfluss haben.
Zum anderen besitzt ein Scanner-Objekt eine Lokalisierungs-Eigenschaft, die die zugrunde liegende Behandlung von regulären Ausdrücken erheblich beeinflusst. Man erkennt dies im Beispiel an der Interpretation des ersten, mit einem Punkt als Dezimaltrenner geschriebenen Dezimalwertes, der hier als String interpretiert wird und dem zweiten, mit Komma geschriebenen Dezimalwert, der hier im deutschen Umfeld als double erfasst wird.

Die Lokalisierung des Scanner-Objekts richtet sich in den Standard-Einstellungen nach der Laufzeitumgebung. Sie kann jedoch auch explizit gesetzt werden, wie es hier in der Zeile

scanner.useLocale(Locale.GERMANY);

demonstriert wird.