2017-10-16 7 views
0

Ich habe ein spezifisches Problem in Bezug auf Scanner und seine Art der Eingabe von System.in.Java Multiline-Scanner-Eingang

Was ich tun möchte: Ich muss eine einzelne Eingabe aus System.in lesen. Das Problem ist, dass dieser Eingang mehr als eine Zeile haben kann (die Eingabe kann viele \n Zeichen haben).

Was ich versucht:

Die offensichtliche Sache, die ich versuchte, ist Scanner.nextLine() Methode, aber natürlich, damit alle Daten nicht lesen. Das nächste, was ich versuchte, ist dies:

Scanner sc = new Scanner(System.in); 
List<String> data = new ArrayList<>(); 

while(sc.hasNextLine()){ 
    String line = sc.nextLine(); 
    if(line.isEmpty()){ 
     break; 
    } 
    data.add(line); 
} 

Aber das wird auch eine Menge Daten überspringt - zum Beispiel, wenn es eine leere Zeile in der Mitte des gegebenen Textes.

Ich habe auch versucht, die break; Anweisung zu entfernen und hoffe, dass die while(sc.hasNextLine()) Schleife sich selbst bricht, aber dies wird nie passieren, da Scanner auf die Daten warten wird.

Kann dies in Java getan werden? Vielen Dank für Ihre Zeit

+0

Die Schleife selbst brechen _will_. Sie müssen nur einen Zeilenende-Zeichen geben. – Sweeper

+0

vielleicht ist dies eine Lösung? https://stackoverflow.com/a/42429171/3959856 –

Antwort

0

Wenn Sie unter Windows auf Command + D oder Control + D drücken, fügen Sie ein Zeilenendezeichen ein.

Wenn der Scanner ein Zeilenendezeichen erreicht, gibt hasNextLine false zurück und die Schleife wird beendet.

diesen So entfernen:

if(line.isEmpty()){ 
    break; 
} 

und ein Ende der Zeile Zeichen nach dem Multi-Line-Eingabe eingeben.

Wenn dies zulässig ist, können Sie die Eingabe auch als Zeichenfolge in den Scanner eingeben. Zum Beispiel, wenn Sie eingeben möchten diesen Eingang:

Hello World 
This is a 
Multiline 
input 

können Sie den Scanner wie folgt initialisieren:

Scanner line = new Scanner("Hello World\n" + 
     "This is a\n" + 
     "Multiline\n" + 
     "input"); 

Oder Sie können Ihre Eingabe in einer Datei speichern, und lassen Sie den Scanner das lesen:

Scanner line = new Scanner(new File("path to your input file")); 
0

Verwenden Sie diesen Typ für

String read = ""; 
    Scanner sc = new Scanner(System.in); 
    String line; 
    while (sc.hasNextLine()) { 
     line = sc.nextLine(); 
     if (line.isEmpty()) { 
      break; 
     } 
     read += line + "\n"; 
    } 
    System.out.println(read); 
Lesen

Hier prüfen wir zuerst, ob dort Nextline auftritt oder nicht. Wenn ja, dann lese die Daten mit der sc.nextLine() -Methode und wenn die gelesenen Daten leer sind, dann brich die Schleife.

0

Wenn Sie alle Eingaben in mehreren Zeilen in eine Liste von Strings ein Element pro Eingabezeile lesen möchten, muss der Benutzer angeben, wann die Eingabe beendet wurde. Dies geschieht oft mit dem Zeichen End-of-File: an der Windows-Eingabeaufforderung ist es Ctrl-Z, und auf Linux, OS X und dem IntelliJ IDE-Eingabefenster auf allen Plattformen ist es Ctrl-D.

Sie können die Linien mit dem folgenden Code lesen:

Scanner sc = new Scanner(System.in); 
List<String> data = sc.tokens().collect(Collectors.toList());