Erste Schritte java.util.Scanner: Beliebig langen Text per Paste in Console eingeben ?

Froschkönig

Mitglied
Hallo liebe Forengemeinde,

bin noch Java Neuling ...UND hab in der Forensuche nix passendes gefunden gerade, also bitte nicht hauen ;-)

Beschäftige mich seit Oktober im Rahmen eines Zweitstudiums mit Java und muß gerade für eine Einsendearbeit ein programm schreiben, welches verschiedene Zeichen in einem String zählen kann. Ich bin mit der Sache acuh fertig und brüte gerade über einer verallgemeinerung, mit weniger Code deutlich mehr zu erreichen. Von Seiten des Umgangs mit der zählerei ist mir das auch ganz gut gelungen, mein Problem ist ein ganz anderes:

Ich wollte jetzt mal stumpf testen, was mein geschriebens Programm zählt, wenn ich den Text von Goethtes Faust bei der Abfrage der zu untersuchenden Zeichenkette eingebe und erhalte beim Paste vorgang in der Console direkt ne Exception und Game Over.

Also die Frage: WIE gehe ich vor, um in Java zuzulassen, dass ich nach aufforderung einer Nutzereingabe evtl 5 zeichen bekomme, oder 10 Zeilen ? oder ein ganzes Buch per Copy und Paste ?
Über den "BufferedReader" kann man wohl Textfiles einlesen, aber mir geht es wirklich um die Frage, ob man irgendwie in der Console lange Textstücke per Copy Paste einfügen kann ohne direkt nene Fehler zu produzieren ?

Danke für jegliche hilfreiche Antwort dazu :)
 

mihe7

Top Contributor
Die Standardeingabe in Java ist ein Stream. Ein solcher hat kein vordefiniertes Ende, daher ist das grundsätzlich überhaupt kein Problem.

Wenn man allerdings erstmal bis zum Zeilenende puffert und mehrere hundert/tausend MB ohne Zeilenende in die Konsole klatscht, dann wird irgendwann der Speicher eng :)

Vermutung: in Deinem Code ist einfach ein Fehler. Was bekommst Du denn für eine Exception?
 

Froschkönig

Mitglied
Jaaaa...die Vermutung mit dem Fehler hab ich auch, sonst würde es ja gehen ;-)

[CODE lang="java"] static String str;

static void zeichenKetteEinlesen() {

Scanner sc = new Scanner(System.in);

sc.useDelimiter(System.lineSeparator());

System.out.println("Bitte geben Sie nun die Zeichenkette ein:");

str=sc.nextLine(); //Deklaration der zu untersuchenden Zeichenkette[/CODE]


Bei ausführung kommt, nachdem man einen Text per Copy&paste in die Console eingibt direkt nach "paste" Folgendes:

Dies ist ein Beispielprogramm zum Umgang mit Zeichenketten.
Sie können im Anschluss eine Zeichenkette eingeben,
sowie zusätzlich Zeichen, die sie darin suchen wollen.
Bei der Suche wird nicht zwischen Gross- und Kleinschreibung unterschieden!

Bitte geben Sie nun die Zeichenkette ein:
Ihr naht euch wieder, schwankende Gestalten!
Die früh sich einst dem trüben Blick gezeigt.
Versuch’ ich wohl euch diesmal fest zu halten?
Fühl’ ich mein Herz noch jenem Wahn geneigt?
Ihr drängt euch zu! nun gut, so mögt ihr walten
Wie ihr aus Dunst und Nebel um mich steigt;
Mein Busen fühlt sich jugendlich erschüttert
Vom Zauberhauch der euren Zug umwittert.Wie viele Zeichen wollen sie darin suchen?

Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at ea04.heidenreich.AlternativeZeichenkettenanalyseTest.zeichenKetteEinlesen(AlternativeZeichenkettenanalyseTest.java:77)
at ea04.heidenreich.AlternativeZeichenkettenanalyseTest.main(AlternativeZeichenkettenanalyseTest.java:36)
 

LimDul

Top Contributor
Da hast du die Zeile:
at ea04.heidenreich.AlternativeZeichenkettenanalyseTest.zeichenKetteEinlesen(AlternativeZeichenkettenanalyseTest.java:77)

Da rufst du nextInt auf - aber die Eingabe ist keine Zahl, sondern ein Text. Wenn du den Text per Copy & Paste mit umbrüchen reinkopierst, liest nextLine nur die erste Zeile und danach geht es weiter. Dann erwartet dein Programm eine Zahl, bekommt aber die zweite Zeile => BUMM
 

Froschkönig

Mitglied
Da hast du die Zeile:
at ea04.heidenreich.AlternativeZeichenkettenanalyseTest.zeichenKetteEinlesen(AlternativeZeichenkettenanalyseTest.java:77)

Da rufst du nextInt auf - aber die Eingabe ist keine Zahl, sondern ein Text. Wenn du den Text per Copy & Paste mit umbrüchen reinkopierst, liest nextLine nur die erste Zeile und danach geht es weiter. Dann erwartet dein Programm eine Zahl, bekommt aber die zweite Zeile => BUMM
Danke für den Hinweis, es ist mir natürlich bewusst, dass eine Exception geworfen wird, wenn ich als Eingabewert ein Integer erwarte aber ein String kommt. die Zeile 77 befindet sich ja aber weiter hinten im Code, das "Problem" ist also, wie ich dem Code davor beibringe, dass da jetzt ein längerer Text , evtl auch mit Zeilenumbrüchen eingegeben wird. Wenn ich die obere Zeile 7 weglasse und bei sc.NextLine() nur sc.next() nehme, passiert das selbe.
 

LimDul

Top Contributor
Du musst solange nextLine aufrufen, bist du sicher bist, den gesamten Text eingelesen zu haben.

Wenn der Benutzer danach noch eine Zahl eingeben soll, kannst du erst mal nicht unterscheiden ob die Zahl zum Text gehört oder das die einzugebende Zahl ist. Das heißt, du musst irgendwas definieren, was das Ende des Textes kenntlich macht (z.B. einen speziellen Text, Leerzeile etc.) - was halt im einzugebenden Text definitiv nicht vorkommt.
 

Froschkönig

Mitglied
Hm...also letzlich (wie auch immer ich schließlich das Eingabe-Ende definiere...) lese ich nacheinander soviele Zeilen im Scanner ein wie eben nötig und verkette dabei die einzelnen Eingabezeilen in einer weiteren String-Variable um mit dieser am Ende weiterzuarbeiten. Habe ich das so einigermaßen richtig wiedergegeben ?
 
K

kneitzel

Gast
Hm...also letzlich (wie auch immer ich schließlich das Eingabe-Ende definiere...) lese ich nacheinander soviele Zeilen im Scanner ein wie eben nötig und verkette dabei die einzelnen Eingabezeilen in einer weiteren String-Variable um mit dieser am Ende weiterzuarbeiten. Habe ich das so einigermaßen richtig wiedergegeben ?
Du kannst die Eingabezeilen natürlich verketten, aber die Frage ist, ob Du nicht Zeile für Zeile bearbeiten kannst. Gerade bei langen Texten sparst Du so eine Menge an Speicher.

Das größere Problem dürfte aber bei dem Vorgehen sein, dass Du nie wissen kannst, wann Du am Ende bist. nextLine wird immer auf eine weitere Eingabe warten. Daher wird der Plan, so lange Zeilen einzulesen, bis Du am Ende bist, nicht funktionieren.

Was man machen könnte, wäre z.B. eine Zeile nur mit einem '.' als Endezeichen zu nehmen (oder irgend etwas in der Art ... von mir aus auch gerne "ENDE" oder so...)
 

Froschkönig

Mitglied
Aber hat sich erledigt, so gehts:

Java:
        do {
            zeile = sc.next();                //Deklaration der zu untersuchenden Zeichenkette
            text = text + zeile;            //Verkettung mehrerer Eingabezeilen zu einem Gesamttext
        } while (!"#".equals(zeile));

Und wer es immer schon wissen wollte: Das Buch Genesis der Bibel enthält 11.749 mal den Buchstaben "a"
 

Froschkönig

Mitglied
Du kannst die Eingabezeilen natürlich verketten, aber die Frage ist, ob Du nicht Zeile für Zeile bearbeiten kannst. Gerade bei langen Texten sparst Du so eine Menge an Speicher.

Das größere Problem dürfte aber bei dem Vorgehen sein, dass Du nie wissen kannst, wann Du am Ende bist. nextLine wird immer auf eine weitere Eingabe warten. Daher wird der Plan, so lange Zeilen einzulesen, bis Du am Ende bist, nicht funktionieren.

Was man machen könnte, wäre z.B. eine Zeile nur mit einem '.' als Endezeichen zu nehmen (oder irgend etwas in der Art ... von mir aus auch gerne "ENDE" oder so...)
Ja das war mir beim Hinweis oben schon klar, habe jetzt erstmal "#" als abbruch parameter dedfiniert (soalnge keine internetseiten mit TwitterHashtags gezählt werden sollen :p. Es funktioniert jetzt wie es soll aber ja, als nächstes denke ich mal drüber nach, wie man es zeilenweise umsetzt, da der Hinweis mit dem Speicher aber auch die Verebeitungsgeschwindigkeit so deutlich optimiert würden
 

Froschkönig

Mitglied
Das ergibt sich ja daraus, wie viele verschiedene Zeichen ich eingebe, oder nicht?
Ich glaube wir reden aneinander vorbei. Man kann eine beliebig Lange zeichenkette eingeben, in welcher Zeichen gesucht werden sollen. und der int wert ist die Abfrage an den nutzer, wie viele zeichen er suchen möchte, welche er danach eingeben kann. das kann man sicher auch anders lösen. aber es geht darum, ob man in einem text nur alle "a" sucht, oder 5 willkürliche Zeichen wie "a", "!" etc...
bestimmt könnte man es auch so schreiben, dass der nutzer als suchkriterium ebenfalls eine zeichenkette eingibt, diese in die einzelnen chars getrettn wird und nach denen wird dann gesucht, dann könnte man sich den zwischenschritt sparen. aber der abgefragte int-Wert war ja nur ein symptom, er stört im programm ja nicht, es war ja das problem, dass ich nicht richtig mit einer unerwarteten zahle von eingabezeilen umgegangen bin für den zu durchsuchenden text
 

mihe7

Top Contributor
Ich glaube wir reden aneinander vorbei.

Nö, ich wollte schon darauf hinaus:
bestimmt könnte man es auch so schreiben, dass der nutzer als suchkriterium ebenfalls eine zeichenkette eingibt, diese in die einzelnen chars getrettn

Auf diese Weise kann man einfach die letzte Zeile der Eingabe als Zeichen interpretieren. Die Eingabe endet, wenn der Stream geschlossen wird. Das passiert bei einem Pipe/Redirect automatisch (z. B. wenn Du die Anwendung mit java -cp . MeinProgramm < textdatei aufrufst), bei manueller Eingabe muss man halt Strg+D (Unixoide) bzw. Strg+Z (Windows) eintippen.

Aber natürlich funktioniert es auch so, wie Du es eh schon gemacht hast.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N java.util.InputMismatchException Fehler Java Scanner Java Basics - Anfänger-Themen 5
M java.util.scanner Fehler Java Basics - Anfänger-Themen 5
W Erste Schritte import java.util.scanner funktioniert nicht Java Basics - Anfänger-Themen 2
P Variablen Abfangen von eingaben per java.util.Scanner und weiter Verarbeitung Java Basics - Anfänger-Themen 7
S Compiler-Fehler Scanner java.util NoSuchElementExeption Java Basics - Anfänger-Themen 8
F java.util.scanner wird übersprungen Java Basics - Anfänger-Themen 9
O java.util.Scanner hängt sich auf Java Basics - Anfänger-Themen 5
Luk10 Java.util.Scanner Java Basics - Anfänger-Themen 11
H ArrayList über java.util.Scanner füllen Java Basics - Anfänger-Themen 5
T import java.util.scanner cannot be resolved Java Basics - Anfänger-Themen 19
J Eclipse und printf und import util.java.scanner; Java Basics - Anfänger-Themen 4
T Möchte Charwert 23C° mit java.util.Scanner einlesen macht Pr Java Basics - Anfänger-Themen 2
M java.util.Scanner kann nicht aufgelöst werden - warum nicht? Java Basics - Anfänger-Themen 4
K Keine weitere (java.util.)Scanner Eingabemöglichkeit? Java Basics - Anfänger-Themen 5
A wie implementiere ich java.util.Scanner? Java Basics - Anfänger-Themen 12
"java.util.HashMap.get(Object)" is null Java Basics - Anfänger-Themen 10
BATMAN_2008 Jackson adding additional fields to JSON throws java.util.concurrent.CompletionException: Java Basics - Anfänger-Themen 2
R java.util.Set, CASE_INSENSITIVE_ORDER Java Basics - Anfänger-Themen 6
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
C java.util Timer läuft zu langsam? Java Basics - Anfänger-Themen 1
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
L Zufälliges Objekt aus der ArraylList ohne java.util.Random Java Basics - Anfänger-Themen 56
A Java.util.Arrays Java Basics - Anfänger-Themen 15
F java.util.ArrayList Java Basics - Anfänger-Themen 3
B java.util.Date noch zeitgemäß? Java Basics - Anfänger-Themen 6
B java.util.Date berechnen Java Basics - Anfänger-Themen 11
Meeresgott OOP Richtig mit java.util.Property umgehen Java Basics - Anfänger-Themen 22
N java.util.Random - Zwei Zahlen mit festgesetzter Wahrscheinlichkeit? Java Basics - Anfänger-Themen 15
A Vererbungshierachie und java.util.Date Java Basics - Anfänger-Themen 31
I google java-diff-util - Patch abspeichern Java Basics - Anfänger-Themen 1
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
H Repräsentation von DateTime (Joda) in Java Util Date überführen Java Basics - Anfänger-Themen 3
D java.util.NoSuchElementException: No line found Java Basics - Anfänger-Themen 11
D Lesen aus Datei (java.util.NoSuchElementException) Java Basics - Anfänger-Themen 22
W Methoden Rückgabedatentyp java.util.Map<java.lang.String,? extends ...> Java Basics - Anfänger-Themen 4
B ThreadPoolExecutor - import java.util.concurrent Java Basics - Anfänger-Themen 2
R java.util.Random Java Basics - Anfänger-Themen 8
S Methoden Sortieren: java.util.Arrays.useLegacyMergeSort Java Basics - Anfänger-Themen 4
E Klassen java.util.ArrayList<E> als Generics Java Basics - Anfänger-Themen 16
D java.util.ResourceBundle - exception Java Basics - Anfänger-Themen 4
M Datentypen java.util.Arrays$ArrayList cannot be cast to [Ljava.lang.String; Java Basics - Anfänger-Themen 11
S Unterschied java.util.prefs / java.util.Properties Java Basics - Anfänger-Themen 3
M java.util.ArrayList to java.sql.Array Java Basics - Anfänger-Themen 4
D java.util.Currency Java Basics - Anfänger-Themen 2
T java.util.Date Java Basics - Anfänger-Themen 5
J java.util.format => mit String? Java Basics - Anfänger-Themen 2
N java.util.Random Java Basics - Anfänger-Themen 6
N verständnisfrage java.util.Calendar Java Basics - Anfänger-Themen 4
P ArrayList<E> in package java.util Java Basics - Anfänger-Themen 4
N java.util.Arrays.sort Warum sind Leerzeichen vor alphabetischen Zeichen sortiert? Java Basics - Anfänger-Themen 12
K java.util.ConcurrentModificationException problem in der Logik? Quaxli-Tutorial Java Basics - Anfänger-Themen 9
D java.util.Currency.getInstance exception mit brit. Pfund Java Basics - Anfänger-Themen 4
M Kann mir bitte jemand "java.util.ArrayList" erklären? Java Basics - Anfänger-Themen 5
V java.util.Stack Java Basics - Anfänger-Themen 9
J Java.Util.Properties wrapper class (Review Request) Java Basics - Anfänger-Themen 2
S BITTE UM HILFE HASHTABLE/import java.util.Hashtable in Ecplipse Java Basics - Anfänger-Themen 12
G DateFormat - Datumsformat java.util.Locale interpretieren Java Basics - Anfänger-Themen 2
? java.util.Properties Wert von key mehrfach vorhanden Java Basics - Anfänger-Themen 13
E java.util.ConcurrentModificationException Problem Java Basics - Anfänger-Themen 5
F java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
Q java.util.loggging neue datei erstellen Java Basics - Anfänger-Themen 3
L Exception in thread "main" java.util.NoSuchElement Java Basics - Anfänger-Themen 4
hedges Würfelwurf mit java.util.Random ohne 0 Java Basics - Anfänger-Themen 6
W Java.util.Map in Bean wandeln Java Basics - Anfänger-Themen 2
M java.util.Timer und geplante Abarbeitung Java Basics - Anfänger-Themen 2
U java.util.Date to java.sql.Date Java Basics - Anfänger-Themen 2
K Wer kann mir java.util.Hastable erklären. Java Basics - Anfänger-Themen 3
K Probleme mit java.util.hashtable Java Basics - Anfänger-Themen 10
K Zipfile erstellen mit java.util.zip.* Java Basics - Anfänger-Themen 2
G java.util.LinkedList: Doppelte Elemente vermeiden Java Basics - Anfänger-Themen 5
K Prob mit java.util.regex.matches-String wird nicht erkannt? Java Basics - Anfänger-Themen 9
K java.util.Calendar und Objekt Java Basics - Anfänger-Themen 7
M Seltsames java.util.Date Problem Java Basics - Anfänger-Themen 6
RaoulDuke java.util.Date parsen Java Basics - Anfänger-Themen 5
M Source Code von java.util.SubList Java Basics - Anfänger-Themen 2
ff java.util.date Java Basics - Anfänger-Themen 2
O reguläre Ausdrücke bei java.util.regex.Pattern Java Basics - Anfänger-Themen 4
D Mit java.util.Arrays.sort die negativen Zahlen hinten Java Basics - Anfänger-Themen 4
C java.util.Timer und wait() oder so was Java Basics - Anfänger-Themen 3
G Leere java.util.List erzeugen Java Basics - Anfänger-Themen 2
S java.awt.List vs. java.util.List Java Basics - Anfänger-Themen 2
D dumme Frage! (was heist 'import java.util.*;' ?) Java Basics - Anfänger-Themen 3
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62

Ähnliche Java Themen

Neue Themen


Oben