- 1 1. Was Sie in diesem Artikel lernen werden (Schneller Schluss)
- 2 2. Was ist „Standardeingabe“ in Java?
- 3 3. Häufige Methoden, um Standard‑Eingabe in Java zu lesen (Übersicht)
- 3.1 3.1 Scanner: Die einfachste und anfängerfreundlichste Option
- 3.2 3.2 BufferedReader: Schnell und Zuverlässig für reale Anwendungen
- 3.3 3.3 Schnelle Eingabe (FastScanner): Für Wettbewerbsprogrammierung
- 3.4 3.4 Schnelle Vergleichstabelle
- 3.5 3.5 Wie man entscheidet, wenn man unsicher ist
- 3.6 3.6 Was als Nächstes kommt
- 4 4. Eingabe von Standardinput mit Scanner (Grundlagen bis praktische Tipps)
- 4.1 4.1 Lesen einer Textzeile (nextLine)
- 4.2 4.2 Zahlen lesen (nextInt, nextLong, usw.)
- 4.3 4.3 Die berühmte Stolperfalle: nextInt() gefolgt von nextLine()
- 4.4 4.4 Wie man das nextLine()-Problem behebt
- 4.5 4.5 Einlesen von durch Leerzeichen getrennten Werten
- 4.6 4.6 Einlesen bis zum Ende der Eingabe (EOF)
- 4.7 4.7 Warum Scanner bei großen Eingaben langsam wird
- 4.8 4.8 Wann Scanner die richtige Wahl ist
- 4.9 4.9 Was als Nächstes kommt
- 5 5. Einlesen von Standardeingaben mit BufferedReader (Schnell und Zuverlässig)
- 5.1 5.1 Minimalbeispiel: Einlesen einer einzelnen Zeile
- 5.2 5.2 Einlesen mehrerer Zeilen bis EOF
- 5.3 5.3 Umwandeln von Zeichenketten in Zahlen
- 5.4 5.4 Umgang mit durch Leerzeichen getrennten Eingaben
- 5.5 5.5 Wiederholte leerzeichengetrennte Zeilen lesen
- 5.6 5.6 Umgang mit IOException
- 5.7 5.7 Warum BufferedReader schnell ist
- 5.8 5.8 Scanner vs BufferedReader – Zusammenfassung
- 5.9 5.9 Was als Nächstes kommt
- 6 6. Schnelle Eingabe für Wettbewerbs‑Programmierung (FastScanner)
- 6.1 6.1 Warum Scanner Zeitlimit‑Fehler verursacht
- 6.2 6.2 Wenn BufferedReader immer noch nicht ausreicht
- 6.3 6.3 Wie schnelle Eingabe funktioniert (konzeptionell)
- 6.4 6.4 Praktische FastScanner‑Implementierung
- 6.5 6.5 Wichtige Einschränkungen des FastScanner
- 6.6 6.6 Zusammenfassung der Eingabemethoden
- 6.7 6.7 Was kommt als Nächstes
- 7 7. Wie man die richtige Eingabemethode wählt (Schneller Entscheidungsleitfaden)
- 8 8. Häufige Fehler und Fehlerbehebung
- 8.1 8.1 Eingabe scheint übersprungen oder fehlend zu sein
- 8.2 8.2 Programm wartet ewig auf Eingabe
- 8.3 8.3 NumberFormatException beim Parsen von Zahlen
- 8.4 8.4 split() erzeugt unerwartete Ergebnisse
- 8.5 8.5 Programm ist zu langsam (Zeitlimit überschritten)
- 8.6 8.6 Verwirrung über geprüfte Ausnahmen (IOException)
- 8.7 8.7 Probleme mit Zeichenkodierung
- 8.8 8.8 Schnell‑Checkliste zur Fehlersuche
- 8.9 8.9 Was kommt als Nächstes
- 9 9. Häufig gestellte Fragen (FAQ)
- 9.1 9.1 Was ist besser: Scanner oder BufferedReader?
- 9.2 9.2 Stimmt es, dass Scanner langsam ist?
- 9.3 9.3 Warum gibt nextLine() einen leeren String zurück?
- 9.4 9.4 Sollte ich split() oder StringTokenizer verwenden?
- 9.5 9.5 Wie lese ich Eingaben bis zum EOF?
- 9.6 9.6 Kann ich FastScanner in realen Anwendungen verwenden?
- 9.7 9.7 Muss ich immer Ausnahmen behandeln?
- 9.8 9.8 Eingabe ist schnell, aber Ausgabe ist langsam. Was soll ich tun?
- 9.9 9.9 Was kommt als Nächstes
- 10 10. Abschließende Zusammenfassung
1. Was Sie in diesem Artikel lernen werden (Schneller Schluss)
Es gibt mehrere Möglichkeiten, Standardeingabe in Java zu handhaben, aber die Kernidee ist einfach:
Wählen Sie die Eingabemethode basierend auf Ihrem Zweck.
Sie benötigen nicht von Anfang an die schnellste oder komplexeste Lösung.
Dieser Artikel erklärt die Standardeingabe in Java Schritt für Schritt, damit Sie klar verstehen wann und warum Sie jede Methode verwenden sollten.
Wir behandeln die Eingabe in Java auf drei praktischen Ebenen:
- Für Anfänger und kleine Programme :
Scanner - Für größere Eingaben und stabile Leistung :
BufferedReader - Für Wettbewerbsprogrammierung und sehr große Eingaben :
FastScanner
1.1 Welche sollten Sie verwenden? (Scanner vs BufferedReader vs Schnelle Eingabe)
Wenn Sie es eilig haben, reicht dieser Abschnitt allein aus, um zu entscheiden.
1) Java lernen oder kleine Eingaben handhaben → Scanner
Typische Anwendungsfälle: wp:list /wp:list
- Java-Tutorials
- Schularbeiten
- Kleine Kommandozeilen-Tools
Vorteile: wp:list /wp:list
Sehr einfach zu schreiben
- Einfach zu lesen und zu verstehen
Nachteile: wp:list /wp:list
Langsam, wenn die Eingabegröße groß wird
Verwenden Sie Scanner, wenn:
- Die Eingabegröße klein ist
- Lesbarkeit wichtiger ist als Leistung
2) Große Eingabe oder stabile Leistung → BufferedReader
Typische Anwendungsfälle: wp:list /wp:list
- Praktische Anwendungen
- Stapelverarbeitung
- Programmierübungen mit vielen Eingabezeilen
Vorteile: wp:list /wp:list
Viel schneller als Scanner
- Vorhersehbares und stabiles Verhalten
Nachteile: wp:list /wp:list
Sie müssen Zahlen und Token manuell parsen
BufferedReader ist eine gute Wahl, wenn:
- Die Eingabegröße groß ist
- Leistung eine Rolle spielt
- Sie volle Kontrolle über die Eingabeverarbeitung wollen
3) Wettbewerbsprogrammierung oder massive Eingabe → FastScanner
Typische Anwendungsfälle: wp:list /wp:list
- Wettbewerbsprogrammierung
- Probleme mit sehr strengen Zeitlimits
Vorteile: wp:list /wp:list
Extrem schnell
Nachteile: wp:list /wp:list
Schwer zu lesen
- Schwierig zu debuggen
- Nicht geeignet für reguläre Anwendungsentwicklung
FastScanner ist angemessen, wenn:
- Die Eingabegröße riesig ist
- Scanner oder BufferedReader Zeitlimit-Fehler verursachen
1.2 Für wen dieser Artikel gedacht ist
Dieser Artikel ist für eine breite Palette von Java-Entwicklern konzipiert.
Anfänger
- Wollen verstehen, was Standardeingabe bedeutet
- Brauchen eine klare Erklärung zu
Scanner - Sind oft verwirrt von eingabebezogenen Fehlern
Fortgeschrittene Lernende
- Kennen bereits Scanner
- Wollen verstehen, warum es langsam wird
- Brauchen eine zuverlässige Methode, um große Eingaben zu handhaben
Wettbewerbsprogrammierer
- Brauchen schnelle Eingabetechniken
- Wollen praktische Vorlagen für Wettbewerbe
1.3 Was Sie nach dem Lesen können
Am Ende dieses Artikels werden Sie in der Lage sein:
- Zu verstehen, was Java-Standardeingabe (
System.in) wirklich ist - Die richtige Eingabemethode für jede Situation zu wählen
Scannerohne gängige Fallstricke zu verwenden- Große Eingaben effizient mit
BufferedReaderzu lesen - Eingaben für Wettbewerbsprogrammierung mit schnellen Techniken zu handhaben
- Gängige eingabebezogene Probleme selbstbewusst zu debuggen
1.4 Was kommt als Nächstes
Im nächsten Abschnitt erklären wir was „Standardeingabe“ in Java eigentlich bedeutet, beginnend mit System.in.
Das Verständnis dieser Grundlage macht die Unterschiede zwischen Scanner, BufferedReader und schnellen Eingabemethoden viel klarer.
2. Was ist „Standardeingabe“ in Java?
Bevor Sie lernen, wie man Scanner oder BufferedReader verwendet, ist es wichtig zu verstehen was „Standardeingabe“ eigentlich bedeutet in Java.
Viele Verwirrungen bezüglich Eingaben entstehen durch das Überspringen dieses grundlegenden Konzepts.
2.1 Die Rolle der Standardeingabe (System.in)
In Java ist Standardeingabe die Standard-Datenquelle, aus der ein Programm liest, wenn es startet.
Diese Quelle wird durch folgendes Objekt dargestellt:
System.in
Wichtige Punkte zu System.in:
- Es stellt einen vom Betriebssystem bereitgestellten Eingabestream dar
- Sein Typ ist
InputStream - Java selbst entscheidet nicht, woher die Eingabe stammt
Mit anderen Worten ist System.in einfach ein Datenstrom, keine „Tastatur‑API“.
2.2 Standard-Eingabe ist nicht immer die Tastatur
Ein sehr verbreiteter Irrtum ist:
Standard-Eingabe = Tastatur-Eingabe
Das ist nur teilweise wahr.
Wenn Sie ein Programm wie dieses ausführen:
java Main
ist die Standard‑Eingabe mit der Tastatur verbunden.
Sie können es jedoch auch so ausführen:
java Main < input.txt
In diesem Fall:
- Eingabe stammt aus einer Datei
- Nicht von der Tastatur
- Aber Java liest sie weiterhin über
System.in
Aus Sicht des Programms gibt es keinen Unterschied.
Deshalb wird die Standard‑Eingabe oft beschrieben als:
“Alle Daten, die zur Laufzeit in das Programm eingespeist werden”
2.3 Warum System.in schwer direkt zu benutzen ist
Obwohl System.in leistungsfähig ist, ist es nicht bequem direkt zu benutzen.
Der Grund ist einfach:
System.inliest rohe BytesEs versteht nicht: wp:list /wp:list
- Zeilen
- Zahlen
- Leerzeichen
- Textkodierung
Beispiel:
InputStream in = System.in;
Auf dieser Ebene arbeiten Sie nur mit Bytes, nicht mit sinnvollen Werten.
Deshalb stellt Java Wrapper‑Klassen bereit, die rohe Eingaben in nutzbare Daten umwandeln.
2.4 Eingabe‑Verarbeitungsschichten in Java
Die Eingabeverarbeitung in Java kann als schichtartige Struktur verstanden werden.
[ Input source (keyboard, file, pipe) ]
↓
System.in (InputStream)
↓
Input helper classes
├ Scanner
├ BufferedReader
└ Fast input implementations
Jede Schicht hat eine klare Verantwortung:
System.in wp:list /wp:list
- Byte‑Stream auf niedriger Ebene
Scanner wp:list /wp:list
- Einfache tokenbasierte Eingabe (langsam aber einfach)
BufferedReader wp:list /wp:list
- Schnelle zeilenbasierte Eingabe
FastScanner wp:list /wp:list
- Leistungsorientierte numerische Eingabe
Das Verständnis dieser Struktur erklärt, warum mehrere Eingabemethoden existieren.
2.5 Warum Java mehrere Eingabemethoden hat
Java wird in vielen verschiedenen Kontexten verwendet:
- Bildung
- Unternehmenssysteme
- Kommandozeilen‑Tools
- Wettbewerbsprogrammierung
Jeder Kontext hat unterschiedliche Prioritäten:
- Benutzerfreundlichkeit
- Lesbarkeit
- Leistung
- Stabilität
Deshalb zwingt Java nicht eine einzige „beste“ Eingabemethode auf.
Stattdessen bietet es mehrere Werkzeuge für unterschiedliche Bedürfnisse.
2.6 Was als Nächstes kommt
Im nächsten Abschnitt werden wir Scanner verwenden, die anfängerfreundlichste Methode, um die Standard‑Eingabe zu lesen.
Sie werden lernen:
- Wie man Zeichenketten liest
- Wie man Zahlen liest
- Häufige Stolperfallen, die Anfänger verwirren
Dies wird Sie darauf vorbereiten, später schnellere Eingabemethoden zu verstehen.
3. Häufige Methoden, um Standard‑Eingabe in Java zu lesen (Übersicht)
Jetzt, da Sie verstehen, was Standard‑Eingabe ist, schauen wir uns die drei Hauptmethoden an, um sie in Java zu lesen.
Bevor wir in Code‑Details eintauchen, ist es wichtig, das große Ganze zu sehen.
Jede Methode existiert aus einem Grund, und die richtige Wahl spart Zeit und Frustration.
3.1 Scanner: Die einfachste und anfängerfreundlichste Option
Scanner ist normalerweise die erste Eingabeklasse, die Java‑Anfänger lernen.
Scanner sc = new Scanner(System.in);
Mit dieser einzigen Zeile können Sie leicht lesen:
- Zeichenketten
- Ganzzahlen
- Gleitkommazahlen
Hauptmerkmale von Scanner
Pros wp:list /wp:list
- Sehr einfach zu schreiben und zu verstehen
- Liest Werte direkt als Java‑Typen
- Weit verbreitet in Tutorials und Lehrbüchern
Cons wp:list /wp:list
- Langsam bei großen Eingaben
- Hat einige knifflige Verhaltensweisen, die Anfänger häufig begegnen
Wann Scanner eine gute Wahl ist
- Java lernen
- Kleine Programme
- Einfache Eingabeanforderungen
If your goal is to understand Java syntax and logic, Scanner is a great starting point.
3.2 BufferedReader: Schnell und Zuverlässig für reale Anwendungen
BufferedReader ist die Standardwahl, sobald Eingabegröße oder Leistung wichtig werden.
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in)
);
Im Gegensatz zu Scanner konzentriert sich BufferedReader darauf, ganze Zeilen effizient zu lesen.
Hauptmerkmale von BufferedReader
Vorteile wp:list /wp:list
- Viel schneller als Scanner
- Vorhersehbares und stabiles Verhalten
- Geeignet für große Eingaben
Nachteile wp:list /wp:list
Erfordert manuelles Parsen
- Etwas komplexerer Code
Wann BufferedReader eine gute Wahl ist
- Praktische Anwendungen
- Batch-Verarbeitung
- Programmierungsaufgaben mit vielen Eingabezeilen
BufferedReader wird oft als die standardmäßige professionelle Wahl angesehen.
3.3 Schnelle Eingabe (FastScanner): Für Wettbewerbsprogrammierung
In der Wettbewerbsprogrammierung kann selbst BufferedReader zu langsam sein.
Um das zu lösen, verwenden viele Entwickler benutzerdefinierte schnelle Eingabeklassen, oft FastScanner genannt.
Eigenschaften der schnellen Eingabe
- Liest Rohbytes mit Puffern
- Vermeidet unnötige Objekterstellung
- Konvertiert Zahlen manuell
Vor- und Nachteile
Vorteile wp:list /wp:list
- Extrem schnell
- Ideal für massive Eingabegrößen
Nachteile wp:list /wp:list
Schwer lesbar
- Schwer zu debuggen
- Nicht geeignet für reguläre Anwendungen
Wann schnelle Eingabe zu verwenden ist
- Wettbewerbsprogrammierung
- Sehr strenge Zeitlimits
- Enorme Eingabegrößen
In der normalen Softwareentwicklung ist schnelle Eingabe selten nötig.
3.4 Schnelle Vergleichstabelle
| Method | Ease of Use | Speed | Typical Use |
|---|---|---|---|
| Scanner | Very high | Low | Learning, small programs |
| BufferedReader | Medium | High | Real applications |
| FastScanner | Low | Very high | Competitive programming |
Diese Tabelle allein kann Ihnen helfen zu entscheiden, welches Werkzeug Sie verwenden sollten.
3.5 Wie man entscheidet, wenn man unsicher ist
Wenn Sie nicht sicher sind, welche Methode Sie wählen sollen, folgen Sie dieser Regel:
Ist dies zum Lernen oder für ein kleines Programm? wp:list /wp:list
Ja → Scanner 2. Ist die Eingabe groß oder ist Leistung wichtig? wp:list /wp:list
Ja → BufferedReader 3. Handelt es sich um ein Wettbewerbsprogrammierproblem? wp:list /wp:list
Ja → FastScanner
Die meisten realen Fälle werden perfekt mit BufferedReader gelöst.
3.6 Was als Nächstes kommt
Im nächsten Abschnitt konzentrieren wir uns darauf, wie man Scanner korrekt verwendet.
Sie werden lernen:
- Wie man Zeichenketten liest
- Wie man Zahlen liest
- Typische Scanner-Fallen und wie man sie vermeidet
Dies wird Ihnen helfen, von Anfang an korrekten Code zur Eingabehandhabung zu schreiben.
4. Eingabe von Standardinput mit Scanner (Grundlagen bis praktische Tipps)
In diesem Abschnitt konzentrieren wir uns auf Scanner, die anfängerfreundlichste Methode, um Standardinput in Java zu lesen.
Wir zeigen nicht nur wie man ihn verwendet, sondern erklären auch warum bestimmte Probleme auftreten, damit Sie häufige Fehler vermeiden können.
4.1 Lesen einer Textzeile (nextLine)
Der einfachste Anwendungsfall ist das Lesen einer kompletten Textzeile.
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
System.out.println(line);
nextLine()liest alles bis zum Zeilenumbruch- Leerzeichen innerhalb der Zeile bleiben erhalten
Beispielhafte Eingabe:
Hello Java World
Ergebnis:
Hello Java World
Diese Methode ist ideal, wenn Sie Sätze oder Freitext lesen möchten.
4.2 Zahlen lesen (nextInt, nextLong, usw.)
Einer der größten Vorteile von Scanner ist, dass er Zahlen direkt lesen kann.
int n = sc.nextInt();
long x = sc.nextLong();
double d = sc.nextDouble();
Wenn die Eingabe lautet:
42
Der Wert 42 wird als int gespeichert, ohne manuelle Umwandlung.
Warum das praktisch ist
- Keine Notwendigkeit für
Integer.parseInt - Weniger Boilerplate-Code
- Leicht für Anfänger zu verstehen
4.3 Die berühmte Stolperfalle: nextInt() gefolgt von nextLine()
Dies ist einer der häufigsten Scanner-bezogenen Fehler.
int n = sc.nextInt();
String s = sc.nextLine(); // often becomes empty
Warum passiert das?
nextInt()liest nur die Zahl- Das Zeilenumbruchzeichen (
\n) bleibt im Eingabepuffer nextLine()liest diesen übrig gebliebenen Zeilenumbruch
Infolgedessen wird s zu einer leeren Zeichenkette.
4.4 Wie man das nextLine()-Problem behebt
Die Standardlösung besteht darin, den verbleibenden Zeilenumbruch zu konsumieren.
int n = sc.nextInt();
sc.nextLine(); // consume newline
String s = sc.nextLine();
Dieses Muster ist extrem häufig und lohnt sich zu merken.
Alternativ kann man das Mischen von nextInt() und nextLine() vollständig vermeiden, indem man alles als Zeichenketten einliest.
4.5 Einlesen von durch Leerzeichen getrennten Werten
Scanner behandelt automatisch Leerzeichen und Zeilenumbrüche als Trennzeichen.
Eingabe:
10 20 30
Code:
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
Das funktioniert ohne zusätzliche Logik.
Versteckte Kosten
- Scanner verwendet intern reguläre Ausdrücke
- Das macht es flexibel, aber langsamer bei großen Eingaben
4.6 Einlesen bis zum Ende der Eingabe (EOF)
Manchmal muss man Eingaben einlesen, bis keine Daten mehr vorhanden sind.
while (sc.hasNext()) {
int value = sc.nextInt();
System.out.println(value);
}
Oder für zeilenbasierte Eingaben:
while (sc.hasNextLine()) {
String line = sc.nextLine();
System.out.println(line);
}
Dieses Muster ist nützlich für Dateieingaben und Online-Judges.
4.7 Warum Scanner bei großen Eingaben langsam wird
Scanner ist nicht langsam, weil es „schlecht“ ist, sondern weil es für Sicherheit und Flexibilität ausgelegt ist.
Gründe dafür sind:
- Parsing von regulären Ausdrücken
- Automatische Typkonvertierung
- Umfassende Eingabevalidierung
Bei kleinen Eingaben ist dieser Aufwand vernachlässigbar.
Bei großen Eingaben wird es zu einem ernsthaften Leistungsproblem.
4.8 Wann Scanner die richtige Wahl ist
Scanner ist eine gute Wahl, wenn:
- Du Java lernst
- Die Eingabegröße ist klein
- Die Lesbarkeit des Codes wichtiger ist als die Geschwindigkeit
Wenn die Leistung ein Problem wird, ist es Zeit, zu BufferedReader zu wechseln.
4.9 Was als Nächstes kommt
Im nächsten Abschnitt stellen wir BufferedReader vor, die Standardlösung für schnelle und zuverlässige Eingaben.
Du wirst lernen:
- Zeilenbasierte Eingabe
- Manuelles Parsen von Zahlen
- Effiziente Handhabung großer Eingaben
5. Einlesen von Standardeingaben mit BufferedReader (Schnell und Zuverlässig)
In diesem Abschnitt wechseln wir zu BufferedReader, das in realen Java‑Programmen und Programmierwettbewerben weit verbreitet ist.
Im Vergleich zu Scanner erfordert es etwas mehr Code, bietet jedoch viel bessere Leistung und Kontrolle.
5.1 Minimalbeispiel: Einlesen einer einzelnen Zeile
Die Grundkonfiguration für BufferedReader sieht so aus:
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in)
);
String line = br.readLine();
System.out.println(line);
readLine()liest Eingaben zeilenweise- Es gibt
nullzurück, wenn keine Eingabe mehr vorhanden ist (EOF)
Dieses klare Verhalten macht das Debuggen viel einfacher als bei Scanner.
5.2 Einlesen mehrerer Zeilen bis EOF
Wenn die Anzahl der Eingabezeilen im Voraus nicht bekannt ist, ist dieses Muster Standard:
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
Warum das gut funktioniert
nullzeigt eindeutig das Ende der Eingabe an- Es sind keine zusätzlichen Prüfungen nötig
- Sehr verbreitet bei Dateieingaben und Online-Judges
5.3 Umwandeln von Zeichenketten in Zahlen
Im Gegensatz zu Scanner liest BufferedReader immer Zeichenketten, sodass die numerische Umwandlung manuell erfolgt.
int n = Integer.parseInt(br.readLine());
long x = Long.parseLong(br.readLine());
double d = Double.parseDouble(br.readLine());
Wichtiger Hinweis
- Wenn die Eingabe keine gültige Zahl ist, tritt eine
NumberFormatExceptionauf - Das zwingt dich, das Eingabeformat genau zu beachten
Obwohl das zunächst umständlich erscheinen mag, führt es zu vorhersehbareren Programmen.
5.4 Umgang mit durch Leerzeichen getrennten Eingaben
Durch Leerzeichen getrennte Werte sind extrem häufig.
Eingabe:
10 20 30
Methode 1: Verwendung von split (Lesbarkeit zuerst)
String[] parts = br.readLine().split(" ");
int a = Integer.parseInt(parts[0]);
int b = Integer.parseInt(parts[1]);
int c = Integer.parseInt(parts[2]);
- Leicht zu verstehen
- Geeignet für kleine bis mittlere Eingaben
- Etwas langsamer wegen regulärer Ausdrücke
Methode 2: Verwendung von StringTokenizer (Leistungsorientiert)
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
- Schneller als
split - Sehr verbreitet im Wettkampf‑Programmieren
- Immer noch völlig gültig in modernem Java
5.5 Wiederholte leerzeichengetrennte Zeilen lesen
Beispiel‑Eingabe:
3
10 20
30 40
50 60
Code:
int n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
System.out.println(x + y);
}
Dieses Muster tritt häufig auf in:
- Programmieraufgaben
- Algorithmusprobleme
- Datenverarbeitungstools

5.6 Umgang mit IOException
Die Methoden von BufferedReader werfen geprüfte Ausnahmen, daher müssen Sie diese behandeln.
Einfacher Ansatz (Lernen / Wettbewerbe):
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in)
);
}
Produktions‑Ansatz:
try {
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in)
);
} catch (IOException e) {
e.printStackTrace();
}
Für Anfänger ist der erste Ansatz in der Regel ausreichend.
5.7 Warum BufferedReader schnell ist
BufferedReader ist schnell, weil:
- Es liest Daten in großen Blöcken (Pufferung)
- Es vermeidet das Parsen von regulären Ausdrücken
- Es lässt Sie steuern, wie Daten interpretiert werden
Kurz gesagt, es trennt:
- Lesen
- Parsen
Dieses Design ist der Hauptunterschied zu Scanner.
5.8 Scanner vs BufferedReader – Zusammenfassung
| Feature | Scanner | BufferedReader |
|---|---|---|
| Ease of use | Very high | Medium |
| Speed | Low | High |
| Line-based input | Weak | Excellent |
| Numeric parsing | Automatic | Manual |
| Real-world usage | Limited | Very common |
5.9 Was als Nächstes kommt
Im nächsten Abschnitt werden wir schnelle Eingabetechniken untersuchen, die im Wettkampf‑Programmieren verwendet werden.
Sie werden lernen:
- Warum selbst BufferedReader zu langsam sein kann
- Wie schnelle Eingabe konzeptionell funktioniert
- Eine praktische FastScanner‑Implementierung
6. Schnelle Eingabe für Wettbewerbs‑Programmierung (FastScanner)
Im Wettbewerbs‑Programmieren kann die Eingabegröße so groß sein, dass selbst BufferedReader zum Engpass wird.
Dieser Abschnitt erklärt warum schnelle Eingabe nötig ist, wie sie funktioniert und wann Sie sie (und wann nicht) einsetzen sollten.
6.1 Warum Scanner Zeitlimit‑Fehler verursacht
Wettbewerbs‑Programmieraufgaben haben oft:
- Hunderttausende bis Millionen von Zahlen
- Strenge Zeitlimits (1–2 Sekunden)
- Begrenzte Ausführungsumgebungen
Scanner führt intern viele Prüfungen durch:
- Parsen von regulären Ausdrücken
- Automatische Typumwandlung
- Umfassende Validierung
Diese Funktionen sind für die Sicherheit hilfreich – aber leistungshungrig.
Infolgedessen verursacht Scanner häufig TLE (Time Limit Exceeded) in Wettbewerben.
6.2 Wenn BufferedReader immer noch nicht ausreicht
BufferedReader ist viel schneller als Scanner, aber es:
- Erstellt
String‑Objekte - Teilt Zeichenketten in Token
- Parst Zahlen aus Text
Bei extrem großen Eingaben können diese Schritte allein zu langsam sein.
Das führt zu einem anderen Ansatz:
Rohbytes lesen und Zahlen manuell konvertieren
6.3 Wie schnelle Eingabe funktioniert (konzeptionell)
Schnelle Eingabetechniken folgen typischerweise diesem Prozess:
- Einen großen Block von Bytes auf einmal lesen
- Sie in einem Byte‑Puffer speichern
- Unnötige Zeichen (Leerzeichen, Zeilenumbrüche) überspringen
- Ziffern direkt in Zahlen umwandeln
- Vermeiden, unnötige Objekte zu erzeugen
Das minimiert:
- Speicherzuweisung
- Garbage Collection
- CPU‑Overhead
6.4 Praktische FastScanner‑Implementierung
Below is a minimaler und praktischer FastScanner geeignet für Wettbewerbe.
static class FastScanner {
private final InputStream in = System.in;
private final byte[] buffer = new byte[1 << 16];
private int ptr = 0, len = 0;
private int readByte() throws IOException {
if (ptr >= len) {
len = in.read(buffer);
ptr = 0;
if (len <= 0) return -1;
}
return buffer[ptr++];
}
int nextInt() throws IOException {
int c;
do {
c = readByte();
} while (c <= ' ');
boolean negative = false;
if (c == '-') {
negative = true;
c = readByte();
}
int value = 0;
while (c > ' ') {
value = value * 10 + (c - '0');
c = readByte();
}
return negative ? -value : value;
}
}
Beispielverwendung:
FastScanner fs = new FastScanner();
int n = fs.nextInt();
Dieser Ansatz ist extrem schnell für große numerische Eingaben.
6.5 Wichtige Einschränkungen des FastScanner
Schnelle Eingabe ist keine universelle Lösung.
Nachteile:
- Schwer zu lesen und zu warten
- Schwer zu debuggen
- Nicht geeignet für textintensive Eingaben
- Überdimensioniert für die meisten Anwendungen
Verwenden Sie FastScanner nur bei Bedarf, typischerweise in Wettbewerben.
6.6 Zusammenfassung der Eingabemethoden
- Scanner → Lernen, kleine Eingaben
- BufferedReader → Reale Anwendungen, große Eingaben
- FastScanner → Nur für Wettbewerbsprogrammierung
Die Wahl des einfachsten Werkzeugs, das Ihren Leistungsanforderungen entspricht, ist immer am besten.
6.7 Was kommt als Nächstes
Im nächsten Abschnitt fassen wir wie man die richtige Eingabemethode wählt mithilfe eines einfachen Entscheidungsleitfadens zusammen.
7. Wie man die richtige Eingabemethode wählt (Schneller Entscheidungsleitfaden)
Bis jetzt haben Sie mehrere Möglichkeiten gesehen, die Standardeingabe in Java zu handhaben.
Dieser Abschnitt hilft Ihnen, schnell und sicher zu entscheiden, welche Methode in realen Situationen zu verwenden ist.
7.1 Für Lernen und kleine Programme
Empfohlen: Scanner
Warum Scanner hier gut funktioniert
- Einfach zu lesen und zu schreiben
- Minimaler Boilerplate
- Passt zu den meisten Einsteiger‑Tutorials
Typische Szenarien:
- Java‑Grundlagen lernen
- Kleine Kommandozeilen‑Tools
- Übungen mit begrenzter Eingabegröße
Scanner sc = new Scanner(System.in); int n = sc.nextInt();
Wenn Ihr Programm nur eine kleine Menge an Eingaben liest, ist Scanner völlig ausreichend.
7.2 Für große Eingaben und stabile Leistung
Empfohlen: BufferedReader
Warum BufferedReader die standardmäßige professionelle Wahl ist
- Schnell und vorhersehbar
- Funktioniert gut mit großen Eingaben
- Einfach zu kontrollierende Eingabe‑Parsing‑Logik
Typische Szenarien:
- Anwendungen aus der Praxis
- Batch‑Jobs
- Programmieraufgaben mit vielen Eingabezeilen
BufferedReader br = new BufferedReader( new InputStreamReader(System.in) );
Wenn Sie unsicher sind und Leistung wichtig ist, ist BufferedReader die sicherste Option.
7.3 Für Wettbewerbsprogrammierung und extreme Eingabegrößen
Empfohlen: FastScanner
Warum FastScanner existiert
- Entwickelt, um TLE zu vermeiden
- Verarbeitet massive numerische Eingaben effizient
Typische Szenarien:
- Wettbewerbsprogrammierwettbewerbe
- Aufgaben mit sehr strengen Zeitlimits
- Extrem große Datensätze
FastScanner fs = new FastScanner(); int n = fs.nextInt();
Außerhalb der Wettbewerbsprogrammierung ist dieser Ansatz normalerweise unnötig.
7.4 Einfacher Entscheidungsfluss
Im Zweifelsfall folgen Sie dieser Logik:
- Ist das für das Lernen oder ein kleines Skript? → Verwenden Sie
Scanner - Ist die Eingabe groß oder ist Leistung wichtig? → Verwenden Sie
BufferedReader - Ist das ein Wettbewerbsproblem mit strengen Zeitlimits? → Verwenden Sie
FastScanner
In der Praxis fallen die meisten Java‑Programme in Schritt 2.
7.5 Häufige Missverständnisse
„Die schnellste Methode ist immer die beste“
Das ist falsch.
- Schnellere Eingabe reduziert die Lesbarkeit
- Komplexer Code erhöht das Fehlerrisiko
- Wartung wird schwieriger
Immer die einfachste Methode bevorzugen, die Ihren Anforderungen entspricht.
„Scanner sollte nie verwendet werden“
Auch falsch.
Scanner ist ein ausgezeichnetes Lernwerkzeug und absolut gültig für kleine Aufgaben.
7.6 Was kommt als Nächstes
Im nächsten Abschnitt werden wir uns häufige Fehler und Tipps zur Fehlerbehebung im Zusammenhang mit der Java-Standard-Eingabe anschauen.
Sie werden lernen:
- Warum die Eingabe unerwartet verhält
- Wie man häufige Parsing-Fehler behebt
- Wie man Leistungsprobleme diagnostiziert
8. Häufige Fehler und Fehlerbehebung
Auch wenn Sie die Grundlagen der Java-Standard-Eingabe verstehen, können kleine Fehler verwirrende Bugs oder Leistungsprobleme verursachen.
Dieser Abschnitt sammelt die häufigsten Probleme, erklärt warum sie auftreten, und zeigt wie man sie behebt.
8.1 Eingabe scheint übersprungen oder fehlend zu sein
Symptome
- Eine String-Variable wird leer
- Eingabe wird übersprungen, ohne auf Benutzereingabe zu warten
Typische Ursache
Das passiert normalerweise, wenn man nextInt() (oder ähnliche Methoden) mit nextLine() in Scanner mischt.
int n = sc.nextInt();
String s = sc.nextLine(); // becomes empty
Lösung
Verbrauchen Sie die verbleibende Neuezeile, bevor Sie nextLine() aufrufen.
int n = sc.nextInt();
sc.nextLine(); // consume newline
String s = sc.nextLine();
Alternativ verwenden Sie BufferedReader und handhaben das Parsing manuell.
8.2 Programm wartet ewig auf Eingabe
Symptome
- Programm beendet sich nicht
- Online-Judge-Einreichung endet nie
Typische Ursache
- Das Programm erwartet mehr Eingabe als bereitgestellt
- EOF (Ende der Eingabe) wird nicht korrekt gehandhabt
Lösung
Verwenden Sie EOF-bewusste Eingabeschleifen.
String line;
while ((line = br.readLine()) != null) {
// process line
}
Überprüfen Sie immer doppelt die Spezifikation des Eingabeformats.
8.3 NumberFormatException beim Parsen von Zahlen
Symptome
- Programm stürzt ab, wenn Strings in Zahlen umgewandelt werden
int n = Integer.parseInt(line);
Typische Ursachen
- Führende oder nachfolgende Leerzeichen
- Leere Zeilen
- Unerwartete Zeichen in der Eingabe
Lösung
Reinigen Sie die Eingabe vor dem Parsen.
line = line.trim();
int n = Integer.parseInt(line);
Überprüfen Sie auch, ob das Eingabeformat Ihren Erwartungen entspricht.
8.4 split() erzeugt unerwartete Ergebnisse
Symptome
- Falsche Anzahl von Tokens
- Leere Strings im Ergebnisarray
Typische Ursache
Mehrere Leerzeichen zwischen Werten.
String[] parts = line.split(" ");
Lösung
Verwenden Sie einen regulären Ausdruck, der mehrere Leerzeichen handhabt.
String[] parts = line.trim().split("\\s+");
Das funktioniert für ein oder mehrere Leerzeichen, Tabs oder Zeilenumbrüche.
8.5 Programm ist zu langsam (Zeitlimit überschritten)
Symptome
- Programm funktioniert lokal, scheitert aber in Wettbewerben
- Ausführungszeit überschreitet Grenzen
Typische Ursachen
- Verwendung von
Scannerfür große Eingaben - Übermäßiger Gebrauch von
split() - Häufige
System.out.println()-Aufrufe
Lösungen
- Wechseln zu
BufferedReader - Verwenden Sie
StringTokenizerstattsplit - Stapelausgabe mit
StringBuilderundPrintWriter
Oft ist die Eingabegeschwindigkeit der wahre Engpass, nicht der Algorithmus.
8.6 Verwirrung über geprüfte Ausnahmen (IOException)
Symptome
- Kompilierungsfehler im Zusammenhang mit
IOException - Unsicher, wo
try-catchhinzugefügt werden soll
Einfache Lösung (Lernen / Wettbewerbe)
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in)
);
}
Produktionslösung
Verwenden Sie ordnungsgemäße try-catch-Blöcke und handhaben Sie Fehler elegant.
8.7 Probleme mit Zeichenkodierung
Symptome
- Nicht-englische Texte erscheinen korrupt
- Unerwartete Zeichen in der Eingabe
Ursache
Fehlübereinstimmung zwischen Eingabekodierung und Javas Standardkodierung.
Lösung
Geben Sie die Kodierung explizit an.
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in, "UTF-8")
);
Das ist besonders wichtig beim Lesen von Dateien oder mehrsprachigen Eingaben.
8.8 Schnell‑Checkliste zur Fehlersuche
Wenn die Eingabe sich unerwartet verhält, prüfen Sie Folgendes:
- Entspricht Ihr Code exakt dem Eingabeformat?
- Handhaben Sie Zeilenumbrüche und Leerzeichen korrekt?
- Mischen Sie
Scanner‑Methoden sicher? - Ist die Eingabegröße zu groß für
Scanner? - Handhaben Sie das Dateiende (EOF) korrekt?
Durch systematisches Prüfen dieser Punkte lassen sich die meisten Probleme lösen.
8.9 Was kommt als Nächstes
Im nächsten Abschnitt beantworten wir häufig gestellte Fragen (FAQ) zur Java‑Standardeingabe.
Damit sollen verbleibende Zweifel geklärt und bewährte Vorgehensweisen verstärkt werden.
9. Häufig gestellte Fragen (FAQ)
Dieser Abschnitt beantwortet die am häufigsten auftretenden Fragen zur Java‑Standardeingabe, insbesondere solche, die Anfänger und fortgeschrittene Entwickler häufig stellen.
9.1 Was ist besser: Scanner oder BufferedReader?
Das hängt von Ihrem Zweck ab.
Verwenden Sie
Scanner, wenn: wp:list /wp:list- Sie Java lernen
- Die Eingabegröße ist klein
- Lesbarkeit ist wichtiger als Leistung
Verwenden Sie
BufferedReader, wenn: wp:list /wp:listDie Eingabegröße ist groß
- Leistung zählt
- Sie ein vorhersehbares Verhalten wünschen
Falls Sie unsicher sind, ist BufferedReader in der Regel die sicherere langfristige Wahl.
9.2 Stimmt es, dass Scanner langsam ist?
Ja, bei großen Eingaben.
Scanner ist ausgelegt für:
- Sicherheit
- Flexibilität
- Benutzerfreundlichkeit
Diese Eigenschaften machen ihn langsamer, wenn große Datenmengen verarbeitet werden.
Bei kleinen Eingaben ist der Unterschied vernachlässigbar.
9.3 Warum gibt nextLine() einen leeren String zurück?
Das passiert, wenn nextLine() nach nextInt() oder ähnlichen Methoden aufgerufen wird.
Grund:
nextInt()verbraucht das Zeilenumbruch‑Zeichen nichtnextLine()liest den übrig gebliebenen Zeilenumbruch
Lösung:
sc.nextLine(); // consume newline
Oder vermeiden Sie das Mischen von token‑basierten und zeilen‑basierten Eingabemethoden.
9.4 Sollte ich split() oder StringTokenizer verwenden?
Verwenden Sie
split(), wenn: wp:list /wp:list- Die Eingabe ist klein
- Lesbarkeit wichtig ist
Verwenden Sie
StringTokenizer, wenn: wp:list /wp:listDie Eingabe ist groß
- Leistung wichtig ist
Im Wettkampf‑Programmieren wird StringTokenizer nach wie vor häufig eingesetzt.
9.5 Wie lese ich Eingaben bis zum EOF?
Mit BufferedReader:
String line;
while ((line = br.readLine()) != null) {
// process input
}
Mit Scanner:
while (sc.hasNext()) {
// process input
}
Die Behandlung von EOF ist bei Dateieingaben und Online‑Judges üblich.
9.6 Kann ich FastScanner in realen Anwendungen verwenden?
Es wird nicht empfohlen.
FastScanner:
- Ist schwer lesbar
- Ist schwer wartbar
- Ist nur für Wettbewerbe optimiert
Für reale Anwendungen ist BufferedReader die beste Balance zwischen Geschwindigkeit und Klarheit.
9.7 Muss ich immer Ausnahmen behandeln?
- Für das Lernen und Wettbewerbe:
public static void main(String[] args) throws Exceptionist akzeptabel. Für Produktionscode: wp:list /wp:list
- Verwenden Sie ein korrektes
try-catch - Behandeln Sie Fehler explizit
- Verwenden Sie ein korrektes
9.8 Eingabe ist schnell, aber Ausgabe ist langsam. Was soll ich tun?
Optimieren Sie auch die Ausgabe.
- Vermeiden Sie häufiges
System.out.println() - Nutzen Sie
StringBuilder - Verwenden Sie
PrintWriterfür gepufferte Ausgabe
Eingabe‑ und Ausgabe‑Leistung sollten gemeinsam optimiert werden.
9.9 Was kommt als Nächstes
Im abschließenden Abschnitt fassen wir alles zusammen und wiederholen die wichtigsten Schlussfolgerungen.
10. Abschließende Zusammenfassung
In diesem Artikel haben wir die Java‑Standardeingabe von Grundlagen für Anfänger bis zu fortgeschrittenen Techniken im Wettkampf‑Programmieren untersucht.
Lassen Sie uns die wichtigsten Punkte noch einmal zusammenfassen.
10.1 Die drei wichtigsten Erkenntnisse
- Kleine Eingaben oder Lernzwecke →
Scanner - Große Eingaben oder reale Anwendungen →
BufferedReader - Wettkampf‑Programmieren und extrem große Eingaben →
FastScanner
.Die richtige Wahl des Werkzeugs für die jeweilige Situation ist weitaus wichtiger, als überall die schnellste Methode zu verwenden.
10.2 Wie man die Verwirrung bei der Eingabehandhabung beendet
Die meiste Verwirrung bei Java‑Eingaben entsteht durch mangelndes Verständnis:
- Warum es mehrere Eingabemethoden gibt
- Welche Kompromisse jede Methode hat
- Wann die Leistung tatsächlich eine Rolle spielt
Sobald man die Eingabehandhabung als Entscheidung im Design betrachtet, verschwindet die Verwirrung.
10.3 Empfohlener Lernpfad für Anfänger
Wenn Sie neu in Java sind, folgen Sie diesem Fortschritt:
- Lernen Sie die Eingabe mit
Scannerkennen - Wechseln Sie zu
BufferedReaderfür bessere Leistung und Kontrolle - Erlernen Sie schnelle Eingabetechniken nur, wenn Sie in die Wettkampf‑Programmierung einsteigen
Dieser Pfad stärkt sowohl das Selbstvertrauen als auch korrekte Gewohnheiten.
10.4 Praktische Tipps für den realen Einsatz
- Stellen Sie stets das Eingabeformat sicher
- Achten Sie auf Zeilenumbrüche und Leerzeichen
- Optimieren Sie Eingabe und Ausgabe gemeinsam
- Verdächtigen Sie die Eingabegeschwindigkeit, wenn die Leistung schlecht ist
Diese einfachen Gewohnheiten verhindern die meisten eingabebezogenen Fehler.
10.5 Wohin geht es als Nächstes
Um Ihre Java‑Kenntnisse nach dem Beherrschen der Standardeingabe zu vertiefen, sollten Sie folgendes in Betracht ziehen:
- Optimierung der Standardausgabe (
PrintWriter,StringBuilder) - Grundlagen der Ausnahmebehandlung
- Collections (
List,Map) in Kombination mit Eingabe - Eingabe‑/Ausgabedesign für Algorithmen
Java‑Standardeingabe mag einfach aussehen, ist aber eine Kernkompetenz, die jedes von Ihnen geschriebene Java‑Programm unterstützt.
Wenn Sie sie beherrschen, wird Ihr Code schneller, sauberer und zuverlässiger.

