Ersätze für Java-Scanner

visar77

Mitglied
Hallo liebe Java-Community,

Ich hab nur eine kurze knappe Frage: Welche Methoden gibt es um Scanner zu ersetzen? Gibt es andere einfachere Methoden um etwas in die Konsole einzugeben?

Lg, Visar
 
Was ist denn deine Bedingung, damit du eine andere Variante einfacher als Scanner bezeichnen würdest? Findest du Scanner kompliziert?

Du kannst theoretisch direkt vom InputStream System.in lesen, dann musst du aber mit bytes umgehen können 😎
Wenn die Varianten weniger Code brauchen, weil bei Scanner muss man java.util.Scanner immer einfügen und dazu noch bei jeder Variabel noch ein Scanner.nextDatentyp() hinzufügen. Wenn die Varianten weniger Code braucht, dann ist sie meiner Meinung nach besser.
 
Du musst so oder so immer erstmal deinen Stream öffnen, die Klasse dazu importieren und dann einlesen. Du willst also 3 Zeilen verkürzen? Diese 3 Schritte wirst du nicht umgehen können. Außer du baust dir eine zusätzliche Klasse im selben Package, die genau das tut
 
Hier mal ein Beispielprogramm, was einmal den BufferedReader und einmal den Scanner benutzt.
Was du als "einfacher" empfindest, musst du selber entscheiden:

Java:
// imports für testBufferedReader()
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

// imports für testScanner()
import java.util.Scanner;

public class TestIO {
    public static void main(String[] args) {
        TestIO testIO = new TestIO();
        System.out.println("BufferdReader");
        testIO.testBufferedReader();
        System.out.println("--------------------------------------------------------------------");
        System.out.println("Scanner");
        testIO.testScanner();
    }

    void testBufferedReader() {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        try {
            System.out.println("Bitte geb Sie zwei Zahlen getrennt durch Leerzeichen ein");
            String text = bufferedReader.readLine();
            String[] tokens = text.split(" ");
            if (tokens.length < 2) {
                System.err.println("Sie sollten doch mindestens zwei Zahlen eingeben");
                return;
            }
            int zahl1 = 0;
            int zahl2 = 0;
            try {
                zahl1 = Integer.parseInt(tokens[0]);
            } catch (NumberFormatException e) {
                System.err.println("Die erste Eingabe war keine Zahl");
                return;
            }
            try {
                zahl2 = Integer.parseInt(tokens[1]);
            } catch (NumberFormatException e) {
                System.err.println("Die zweite Eingabe war keine Zahl");
                return;
            }
            System.out.println("Ihre Eingabezahlen waren " + zahl1 + " und " + zahl2);
        } catch (IOException e) {
            System.err.println("IOEcxeption in testBufferedReader() aufgetreten");
            return;
        }
    }

    void testScanner() {
        // Hier werden falsche Eingaben nicht abgefangen!
        // Wenn man das noch machen will, wird es auch hier mühselig.
        Scanner scanner = new Scanner(System.in);
        System.out.println("Bitte geben Sie zwei Zahlen getrennt durch Leerzeichen ein");
        int zahl1 = scanner.nextInt();
        int zahl2 = scanner.nextInt();
        System.out.println("Ihre Eingabezahlen waren " + zahl1 + " und " + zahl2);
    }
}
 
Zuletzt bearbeitet:
Hier wurde künstlich einer der wenigen Anwendungsfälle konstruiert, bei dem die Verwendung von BR weniger vorteilhaft dargestellt werden soll. Aber gut, jeder wie er will.
 
Hier wurde künstlich einer der wenigen Anwendungsfälle konstruiert, bei dem die Verwendung von BR weniger vorteilhaft dargestellt werden soll. Aber gut, jeder wie er will.
Nein,

beim Benutzen des BufferedReader und von Integer.parseInt() und beim Zugriff auf ein Array muss ich die Exceptions abfangen oder vorher prüfen (if(tokens.length < 2), dass keine Exceptions (ArrayIndexOutOfBoundsException) auftreten können.
Das sieht erst einmal mühsam aus.
Beim Scanner kann ich mir dies sparen - habe aber zunächst keine Kontrolle bei falschen Eingaben. Ich hatte ja ausdrücklich geschrieben:
void testScanner() {
// Hier werden falsche Eingaben nicht abgefangen!
// Wenn man das noch machen will, wird es auch hier mühselig.
Ich habe auch keine Ahnung, wie man mit dem Scanner Falscheingaben abfängt (natürlich gibt es hasNextInt(), aber was tue ich, wenn dies "false" zurückliefert.).

Ich denke, dass es folgendes Dilemma gibt:
- In jeder Anwendung erwartet es der User, dass er eine graphische Oberfläche hat; Eingaben auf einem schwarzen Bildschirm sind wohl nicht mehr zeitgemäß (es sei denn, ich schreibe ein schnelles Programm für mich oder einen anderen IT-Spezi).
- Wir raten immer allen Anfängern davon ab, zu früh mit der Oberflächenprogrammierung zu beginnen - sie sollen erst einmal anständig Java lernen.

In der Situation eines Java-Anfängers, der beispielsweise alle Primzahlen bis zu einer einzugebenden Zahl n berechnen soll, ist es am einfachsten, diese Zahl n mit dem Scanner einzulesen.
Für andere Anwendungen, die insbesondere nicht von System.in sondern aus einem anderen Input-Stream lesen, würde ich auch den BufferedReader empfehlen.

Gruß
FHoffmann

Edit: Mich hat es nur gewundert, dass in der ursprünglichen Frage die Benutzung des Scanners als "nicht einfach" dargestellt wurde, und dass dann als "einfachere" Lösung die Benutzung von BufferedReader vorgeschlagen wurde.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben