Wie kann ich Eingaben von der Konsole mithilfe der Scannerklasse in Java lesen?


224

Wie kann ich mithilfe der ScannerKlasse Eingaben von der Konsole lesen ? Etwas wie das:

System.out.println("Enter your username: ");
Scanner = input(); // Or something like this, I don't know the code

Grundsätzlich möchte ich nur, dass der Scanner eine Eingabe für den Benutzernamen liest und die Eingabe einer StringVariablen zuweist.



Antworten:


339

Ein einfaches Beispiel, um zu veranschaulichen, wie es java.util.Scannerfunktioniert, wäre das Lesen einer einzelnen Ganzzahl aus System.in. Es ist wirklich ganz einfach.

Scanner sc = new Scanner(System.in);
int i = sc.nextInt();

Um einen Benutzernamen abzurufen, würde ich wahrscheinlich verwenden sc.nextLine().

System.out.println("Enter your username: ");
Scanner scanner = new Scanner(System.in);
String username = scanner.nextLine();
System.out.println("Your username is " + username);

Sie können auch verwenden, next(String pattern)wenn Sie mehr Kontrolle über die Eingabe wünschen oder nur die usernameVariable validieren möchten .

Weitere Informationen zu deren Implementierung finden Sie in der API-Dokumentation fürjava.util.Scanner


1
Angenommen, ich verwende den Scanner nur einmal und möchte meinen Code nicht durch Initialisieren und Schließen des Scanners überladen. Gibt es eine Möglichkeit, Eingaben vom Benutzer zu erhalten, ohne eine Klasse zu erstellen?
Nearoo

3
Sie können in JDK 8 einen Versuch mit Ressourcenanweisung verwenden, z. versuchen (Scanner Scanner = neuer Scanner (System.in)) {}
Rune Vikestad

33
Scanner scan = new Scanner(System.in);
String myLine = scan.nextLine();

24

Daten von der Konsole lesen

  • BufferedReaderist synchronisiert, sodass Lesevorgänge auf einem BufferedReader sicher von mehreren Threads aus ausgeführt werden können. Die Puffergröße kann angegeben werden, oder die Standardgröße ( 8192 ) kann verwendet werden. Die Standardeinstellung ist für die meisten Zwecke groß genug.

    readLine () « liest nur Daten Zeile für Zeile aus dem Stream oder der Quelle. Eine Zeile wird als durch eine der folgenden abgeschlossen: \ n, \ r (oder) \ r \ n

  • ScannerUnterbricht die Eingabe in Token mithilfe eines Trennzeichens, das standardmäßig mit Leerzeichen übereinstimmt und von erkannt wird Character.isWhitespace.

    « Bis der Benutzer Daten eingibt, kann der Scanvorgang blockiert werden und auf die Eingabe warten. « Verwenden Sie den Scanner ( BUFFER_SIZE = 1024 ), wenn Sie einen bestimmten Tokentyp aus einem Stream analysieren möchten. « Ein Scanner ist jedoch nicht threadsicher. Es muss extern synchronisiert werden.

    next () «Findet den nächsten vollständigen Token von diesem Scanner und gibt ihn zurück. nextInt () «Scannt das nächste Token der Eingabe als int.

Code

String name = null;
int number;

java.io.BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
name = in.readLine(); // If the user has not entered anything, assume the default value.
number = Integer.parseInt(in.readLine()); // It reads only String,and we need to parse it.
System.out.println("Name " + name + "\t number " + number);

java.util.Scanner sc = new Scanner(System.in).useDelimiter("\\s");
name = sc.next();  // It will not leave until the user enters data.
number = sc.nextInt(); // We can read specific data.
System.out.println("Name " + name + "\t number " + number);

// The Console class is not working in the IDE as expected.
java.io.Console cnsl = System.console();
if (cnsl != null) {
    // Read a line from the user input. The cursor blinks after the specified input.
    name = cnsl.readLine("Name: ");
    System.out.println("Name entered: " + name);
}

Ein- und Ausgänge von Stream

Reader Input:     Output:
Yash 777          Line1 = Yash 777
     7            Line1 = 7

Scanner Input:    Output:
Yash 777          token1 = Yash
                  token2 = 777

Dies ist jetzt eine bessere, aktuellere Antwort als die ursprüngliche imo.
LogicOnAbstractions

Weitere Informationen finden Sie unter: BufferedReader, ScannerLesen von Daten aus einer lokalen Datei (OR).
Yash

14

Es gibt ein Problem mit der input.nextInt () -Methode - sie liest nur den int-Wert.

Wenn Sie also die nächste Zeile mit input.nextLine () lesen, erhalten Sie "\ n", dh den EnterSchlüssel. Um dies zu überspringen, müssen Sie die input.nextLine () hinzufügen.

Versuchen Sie es so:

 System.out.print("Insert a number: ");
 int number = input.nextInt();
 input.nextLine(); // This line you have to add (it consumes the \n character)
 System.out.print("Text1: ");
 String text1 = input.nextLine();
 System.out.print("Text2: ");
 String text2 = input.nextLine();

10

Es gibt verschiedene Möglichkeiten, Eingaben vom Benutzer zu erhalten. Hier in diesem Programm nehmen wir die Scanner-Klasse, um die Aufgabe zu erfüllen. Diese Scannerklasse java.utilfällt unter , daher lautet die erste Zeile des Programms import java.util.Scanner. Dadurch kann der Benutzer Werte verschiedener Typen in Java lesen. Die Importanweisungszeile sollte in der ersten Zeile des Java-Programms stehen, und wir fahren mit dem Code fort.

in.nextInt(); // It just reads the numbers

in.nextLine(); // It get the String which user enters

Um auf Methoden in der Scannerklasse zuzugreifen, erstellen Sie ein neues Scannerobjekt als "in". Jetzt verwenden wir eine seiner Methoden, nämlich "next". Die "nächste" Methode ruft die Textzeichenfolge ab, die ein Benutzer über die Tastatur eingibt.

Hier verwende ich in.nextLine();, um den String zu erhalten, den der Benutzer eingibt.

import java.util.Scanner;

class GetInputFromUser {
    public static void main(String args[]) {
        int a;
        float b;
        String s;

        Scanner in = new Scanner(System.in);
        System.out.println("Enter a string");
        s = in.nextLine();
        System.out.println("You entered string " + s);

        System.out.println("Enter an integer");
        a = in.nextInt();
        System.out.println("You entered integer " + a);

        System.out.println("Enter a float");
        b = in.nextFloat();
        System.out.println("You entered float " + b);
    }
}

9
import java.util.Scanner;

public class ScannerDemo {
    public static void main(String[] arguments){
        Scanner input = new Scanner(System.in);

        String username;
        double age;
        String gender;
        String marital_status;
        int telephone_number;

        // Allows a person to enter his/her name   
        Scanner one = new Scanner(System.in);
        System.out.println("Enter Name:" );  
        username = one.next();
        System.out.println("Name accepted " + username);

        // Allows a person to enter his/her age   
        Scanner two = new Scanner(System.in);
        System.out.println("Enter Age:" );  
        age = two.nextDouble();
        System.out.println("Age accepted " + age);

        // Allows a person to enter his/her gender  
        Scanner three = new Scanner(System.in);
        System.out.println("Enter Gender:" );  
        gender = three.next();
        System.out.println("Gender accepted " + gender);

        // Allows a person to enter his/her marital status
        Scanner four = new Scanner(System.in);
        System.out.println("Enter Marital status:" );  
        marital_status = four.next();
        System.out.println("Marital status accepted " + marital_status);

        // Allows a person to enter his/her telephone number
        Scanner five = new Scanner(System.in);
        System.out.println("Enter Telephone number:" );  
        telephone_number = five.nextInt();
        System.out.println("Telephone number accepted " + telephone_number);
    }
}

5
Gibt es einen bestimmten Grund, warum jedes Mal ein neuer Scanner erstellt wird, oder ist dies nur Kopieren + Einfügen, ohne zu verstehen, wie es funktioniert?
Evgeni Sergeev

1
@EvgeniSergeev neuer Scanner ist das Objekt, das Sie erstellen, um die Benutzereingaben zu erhalten. Lesen Sie mehr über die Scannerklasse ...
user3598655

definitiv kopieren eingefügt. Es ist nicht jedes Mal ein neuer Scanner erforderlich (dies entspricht auch nicht der Namenskonvention für Java-Variablen).
Gnomed

6

Sie können ein einfaches Programm erstellen, um nach dem Namen des Benutzers zu fragen und die Eingaben für die Antwort zu drucken.

Oder fordern Sie den Benutzer auf, zwei Zahlen einzugeben, und Sie können diese Zahlen addieren, multiplizieren, subtrahieren oder dividieren und die Antworten für Benutzereingaben genau wie das Verhalten eines Taschenrechners drucken.

Dort benötigen Sie also die Scannerklasse. Sie müssen import java.util.Scanner;und im Code müssen Sie verwenden:

Scanner input = new Scanner(System.in);

input ist ein Variablenname.

Scanner input = new Scanner(System.in);

System.out.println("Please enter your name: ");
s = input.next(); // Getting a String value

System.out.println("Please enter your age: ");
i = input.nextInt(); // Getting an integer

System.out.println("Please enter your salary: ");
d = input.nextDouble(); // Getting a double

Sehen Sie, wie Sie dieses Bild unterscheidet sich : input.next();, i = input.nextInt();,d = input.nextDouble();

Laut einem String variieren int und double im Übrigen auf die gleiche Weise. Vergessen Sie nicht die Importanweisung oben in Ihrem Code.


2
Dies ist eigentlich eine richtige Erklärung, aber es könnte besser sein, wenn Sie weitere Methoden wie nextLine (), nextLong () .. etc
subhashis

Die Schüler müssen den Beispielen folgen und den Rest der Methoden testen und selbst lernen, was ich als Lernen mit eigener Erfahrung glaube.
user3598655

4

Ein einfaches Beispiel:

import java.util.Scanner;

public class Example
{
    public static void main(String[] args)
    {
        int number1, number2, sum;

        Scanner input = new Scanner(System.in);

        System.out.println("Enter First multiple");
        number1 = input.nextInt();

        System.out.println("Enter second multiple");
        number2 = input.nextInt();

        sum = number1 * number2;

        System.out.printf("The product of both number is %d", sum);
    }
}

3

Wenn der Benutzer seine Eingabe eingibt username, prüfen Sie auch, ob eine gültige Eingabe vorliegt.

java.util.Scanner input = new java.util.Scanner(System.in);
String userName;
final int validLength = 6; // This is the valid length of an user name

System.out.print("Please enter the username: ");
userName = input.nextLine();

while(userName.length() < validLength) {

    // If the user enters less than validLength characters
    // ask for entering again
    System.out.println(
        "\nUsername needs to be " + validLength + " character long");

    System.out.print("\nPlease enter the username again: ");
    userName = input.nextLine();
}

System.out.println("Username is: " + userName);

2
  1. So lesen Sie die Eingabe:

    Scanner scanner = new Scanner(System.in);
    String input = scanner.nextLine();
  2. So lesen Sie Eingaben, wenn Sie eine Methode mit einigen Argumenten / Parametern aufrufen:

    if (args.length != 2) {
        System.err.println("Utilizare: java Grep <fisier> <cuvant>");
        System.exit(1);
    }
    try {
        grep(args[0], args[1]);
    } catch (IOException e) {
        System.out.println(e.getMessage());
    }

1
Sie sollten diese Hilfeseite zum Formatieren Ihres Textes / Codes lesen : stackoverflow.com/help/formatting .
Tom

Vielleicht möchten Sie es übersetzen (aus dem Französischen?).
Peter Mortensen

2
import java.util.*;

class Ss
{
    int id, salary;
    String name;

   void Ss(int id, int salary, String name)
    {
        this.id = id;
        this.salary = salary;
        this.name = name;
    }

    void display()
    {
        System.out.println("The id of employee:" + id);
        System.out.println("The name of employye:" + name);
        System.out.println("The salary of employee:" + salary);
    }
}

class employee
{
    public static void main(String args[])
    {
        Scanner sc = new Scanner(System.in);

        Ss s = new Ss(sc.nextInt(), sc.nextInt(), sc.nextLine());
        s.display();
    }
}

2

Hier ist die vollständige Klasse, die die erforderliche Operation ausführt:

import java.util.Scanner;

public class App {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        final int valid = 6;

        Scanner one = new Scanner(System.in);
        System.out.println("Enter your username: ");
        String s = one.nextLine();

        if (s.length() < valid) {
            System.out.println("Enter a valid username");
            System.out.println(
                "User name must contain " + valid + " characters");
            System.out.println("Enter again: ");
            s = one.nextLine();
        }

        System.out.println("Username accepted: " + s);

        Scanner two = new Scanner(System.in);
        System.out.println("Enter your age: ");
        int a = two.nextInt();
        System.out.println("Age accepted: " + a);

        Scanner three = new Scanner(System.in);
        System.out.println("Enter your sex: ");
        String sex = three.nextLine();
        System.out.println("Sex accepted: " + sex);
    }
}

1
Es gibt keinen Grund, mehrere Instanzen von zu verwenden Scanner.
Radiodef

1

Sie können diesen Code fließen lassen:

Scanner obj= new Scanner(System.in);
String s = obj.nextLine();

1
Dies liefert keine neuen Informationen und ist aufgrund fehlender Erklärungen noch weniger hilfreich als vorhandene Antworten.
Tom

1
Was meinst du mit "Flow this Code" ? Meinst du "folge diesem Code" ? Oder etwas anderes?
Peter Mortensen

0

Sie können die Scannerklasse in Java verwenden

Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
System.out.println("String: " + s);

0

Es gibt eine einfache Möglichkeit, von der Konsole aus zu lesen.

Bitte finden Sie den folgenden Code:

import java.util.Scanner;

    public class ScannerDemo {

        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);

            // Reading of Integer
            int number = sc.nextInt();

            // Reading of String
            String str = sc.next();
        }
    }

Ein detailliertes Verständnis finden Sie in den folgenden Dokumenten.

Doc

Lassen Sie uns nun über das detaillierte Verständnis der Funktionsweise der Scannerklasse sprechen:

public Scanner(InputStream source) {
    this(new InputStreamReader(source), WHITESPACE_PATTERN);
}

Dies ist der Konstruktor zum Erstellen der Scannerinstanz.

Hier übergeben wir die InputStreamReferenz, die nichts als a ist System.In. Hier öffnet sich das InputStreamPipe für die Konsoleneingabe.

public InputStreamReader(InputStream in) {
    super(in);
    try {
        sd = StreamDecoder.forInputStreamReader(in, this, (String)null); // ## Check lock object
    }
    catch (UnsupportedEncodingException e) {
        // The default encoding should always be available
        throw new Error(e);
    }
}

Durch Übergeben von System.in öffnet dieser Code den Socket zum Lesen von der Konsole.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.