Suche…


Syntax

  • Scanner Scanner = neuer Scanner (Quellquelle);
  • Scanner Scanner = neuer Scanner (System.in);

Parameter

Parameter Einzelheiten
Quelle Quelle kann entweder String, File oder InputStream sein

Bemerkungen

Die Scanner Klasse wurde in Java 5 eingeführt. Die reset() Methode wurde in Java 6 hinzugefügt. In Java 7 wurden einige neue Konstruktoren hinzugefügt, um die Interoperabilität mit der (dann) neuen Path Schnittstelle zu Path .

Systemeingabe mit Scanner lesen

Scanner scanner = new Scanner(System.in); //Scanner obj to read System input
String inputTaken = new String();
while (true) {
    String input = scanner.nextLine(); // reading one line of input
    if (input.matches("\\s+"))         // if it matches spaces/tabs, stop reading
        break;
    inputTaken += input + " ";
}
System.out.println(inputTaken);

Das Scannerobjekt wird initialisiert, um Eingaben von der Tastatur zu lesen. Für die unten stehende Eingabe von keyboar wird die Ausgabe als Reading from keyboard

Reading
from
keyboard
  //space

Dateieingabe mit Scanner lesen

Scanner scanner = null;
try {
    scanner = new Scanner(new File("Names.txt"));
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (Exception e) {
    System.err.println("Exception occurred!");
} finally {
    if (scanner != null)
        scanner.close();
}

Hier wird ein Scanner Objekt erstellt, indem ein File Objekt mit dem Namen einer Textdatei als Eingabe übergeben wird. Diese Textdatei wird vom File-Objekt geöffnet und in den folgenden Zeilen vom Scanner-Objekt eingelesen. scanner.hasNext() prüft, ob eine nächste scanner.hasNext() in der Textdatei enthalten ist. Wenn Sie dies mit einer while Schleife Names.txt , können Sie jede Names.txt in der Datei Names.txt . Um die Daten selbst abzurufen, können Methoden wie nextLine() , nextInt() , nextBoolean() usw. verwendet werden. Im obigen Beispiel wird scanner.nextLine() verwendet. nextLine() bezieht sich auf die folgende Zeile in einer Textdatei. Durch das Kombinieren mit einem scanner können Sie den Inhalt der Zeile drucken. Um ein .close() zu schließen, verwenden Sie .close() .

Mit try mit Ressourcen (ab Java 7) kann der oben erwähnte Code wie folgt elegant geschrieben werden.

try (Scanner scanner = new Scanner(new File("Names.txt"))) {
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (Exception e) {
    System.err.println("Exception occurred!");
}

Lesen Sie die gesamte Eingabe als Zeichenfolge mit dem Scanner

Sie können Scanner , um den gesamten Text in der Eingabe als Scanner zu lesen, indem Sie \Z (gesamte Eingabe) als Trennzeichen verwenden. So können Sie beispielsweise den gesamten Text einer Textdatei in einer Zeile lesen:

String content = new Scanner(new File("filename")).useDelimiter("\\Z").next();
System.out.println(content);

Denken Sie daran, dass Sie den Scanner schließen und die IoException abfangen müssen, die möglicherweise IoException , wie im Beispiel Lesen der Dateieingabe mit Scanner beschrieben .

Verwenden von benutzerdefinierten Trennzeichen

Sie können benutzerdefinierte Begrenzer (reguläre Ausdrücke) mit Scanner und .useDelimiter(",") , um zu bestimmen, wie die Eingabe gelesen wird. Dies funktioniert ähnlich wie String.split(...) . Beispielsweise können Sie Scanner , um aus einer Liste mit durch Kommas getrennten Werten in einem String zu lesen:

Scanner scanner = null;
try{
    scanner = new Scanner("i,like,unicorns").useDelimiter(",");;
    while(scanner.hasNext()){
        System.out.println(scanner.next());
    }
}catch(Exception e){
    e.printStackTrace();
}finally{
    if (scanner != null)
        scanner.close();
}

Dadurch können Sie jedes Element in der Eingabe einzeln lesen. Beachten Sie, dass Sie dies nicht zum Parsen von CSV-Daten verwenden sollten. Verwenden Sie stattdessen eine geeignete CSV-Parser-Bibliothek. Weitere Möglichkeiten finden Sie unter CSV-Parser für Java .

Allgemeines Muster, das am häufigsten nach Aufgaben gefragt wird

Im Folgenden wird beschrieben, wie Sie die Klasse java.util.Scanner richtig verwenden, um die Benutzereingaben von System.in richtig zu lesen (manchmal als stdin , insbesondere in C, C ++ und anderen Sprachen sowie in Unix und Linux). Es demonstriert idiomatisch die häufigsten Dinge, die gefordert werden.

package com.stackoverflow.scanner;

import javax.annotation.Nonnull;
import java.math.BigInteger;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import java.util.regex.Pattern;

import static java.lang.String.format;

public class ScannerExample
{
    private static final Set<String> EXIT_COMMANDS;
    private static final Set<String> HELP_COMMANDS;
    private static final Pattern DATE_PATTERN;
    private static final String HELP_MESSAGE;

    static
    {
        final SortedSet<String> ecmds = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
        ecmds.addAll(Arrays.asList("exit", "done", "quit", "end", "fino"));
        EXIT_COMMANDS = Collections.unmodifiableSortedSet(ecmds);
        final SortedSet<String> hcmds = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
        hcmds.addAll(Arrays.asList("help", "helpi", "?"));
        HELP_COMMANDS = Collections.unmodifiableSet(hcmds);
        DATE_PATTERN = Pattern.compile("\\d{4}([-\\/])\\d{2}\\1\\d{2}"); // http://regex101.com/r/xB8dR3/1
        HELP_MESSAGE = format("Please enter some data or enter one of the following commands to exit %s", EXIT_COMMANDS);
    }

    /**
     * Using exceptions to control execution flow is always bad.
     * That is why this is encapsulated in a method, this is done this
     * way specifically so as not to introduce any external libraries
     * so that this is a completely self contained example.
     * @param s possible url
     * @return true if s represents a valid url, false otherwise
     */
    private static boolean isValidURL(@Nonnull final String s)
    {
        try { new URL(s); return true; }
        catch (final MalformedURLException e) { return false; }
    }

    private static void output(@Nonnull final String format, @Nonnull final Object... args)
    {
        System.out.println(format(format, args));
    }

    public static void main(final String[] args)
    {
        final Scanner sis = new Scanner(System.in);
        output(HELP_MESSAGE);
        while (sis.hasNext())
        {
            if (sis.hasNextInt())
            {
                final int next = sis.nextInt();
                output("You entered an Integer = %d", next);
            }
            else if (sis.hasNextLong())
            {
                final long next = sis.nextLong();
                output("You entered a Long = %d", next);
            }
            else if (sis.hasNextDouble())
            {
                final double next = sis.nextDouble();
                output("You entered a Double = %f", next);
            }
            else if (sis.hasNext("\\d+"))
            {
                final BigInteger next = sis.nextBigInteger();
                output("You entered a BigInteger = %s", next);
            }
            else if (sis.hasNextBoolean())
            {
                final boolean next = sis.nextBoolean();
                output("You entered a Boolean representation = %s", next);
            }
            else if (sis.hasNext(DATE_PATTERN))
            {
                final String next = sis.next(DATE_PATTERN);
                output("You entered a Date representation = %s", next);
            }
            else // unclassified
            {
                final String next = sis.next();
                if (isValidURL(next))
                {
                    output("You entered a valid URL = %s", next);
                }
                else
                {
                    if (EXIT_COMMANDS.contains(next))
                    {
                        output("Exit command %s issued, exiting!", next);
                        break;
                    }
                    else if (HELP_COMMANDS.contains(next)) { output(HELP_MESSAGE); }
                    else { output("You entered an unclassified String = %s", next); }
                }
            }
        }
        /*
           This will close the underlying Readable, in this case System.in, and free those resources.
           You will not be to read from System.in anymore after this you call .close().
           If you wanted to use System.in for something else, then don't close the Scanner.
        */
        sis.close();
        System.exit(0);
    }
}

Liest ein int von der Kommandozeile

import java.util.Scanner;

Scanner s = new Scanner(System.in);
int number = s.nextInt();

Wenn Sie ein int aus der Befehlszeile lesen möchten, verwenden Sie einfach dieses Snippet. Zunächst müssen Sie ein Scanner-Objekt erstellen, das auf System.in wartet, das standardmäßig die Befehlszeile ist, wenn Sie das Programm von der Befehlszeile aus starten. Danach lesen Sie mit Hilfe des Scanner-Objekts das erste int, das der Benutzer in die Befehlszeile übergibt, und speichern es in der Variablennummer. Jetzt können Sie mit dem gespeicherten int machen, was Sie wollen.

Scanner vorsichtig schließen

Es kann vorkommen, dass Sie einen Scanner mit dem Parameter "System.in" als Parameter für den Konstruktor verwenden. Dann müssen Sie wissen, dass beim Schließen des Scanners auch der InputStream geschlossen wird. Als Nächstes wird versucht, die Eingabe darauf zu lesen Scannerobjekt) löst eine java.util.NoSuchElementException oder eine java.lang.IllegalStateException

Beispiel:

    Scanner sc1 = new Scanner(System.in);
    Scanner sc2 = new Scanner(System.in);
    int x1 = sc1.nextInt();
    sc1.close();
    // java.util.NoSuchElementException
    int x2 = sc2.nextInt();
    // java.lang.IllegalStateException
    x2 = sc1.nextInt();


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow