Come posso leggere l'input dalla console usando la classe Scanner in Java?


224

Come posso leggere l'input dalla console usando la Scannerclasse? Qualcosa come questo:

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

Fondamentalmente, tutto ciò che voglio è che lo scanner legga un input per il nome utente e assegni l'input a una Stringvariabile.


1
Dai

2
Esempio di codice valido
John Detroit,

Risposte:


341

Un semplice esempio per illustrare come java.util.Scannerfunzionerebbe la lettura di un singolo intero da System.in. È davvero abbastanza semplice.

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

Per recuperare un nome utente probabilmente userei 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);

È inoltre possibile utilizzare next(String pattern)se si desidera un maggiore controllo sull'input o semplicemente convalidare la usernamevariabile.

Ulteriori informazioni sulla loro implementazione sono disponibili nella documentazione API perjava.util.Scanner


1
Diciamo che uso lo scanner solo una volta e non voglio ingombrare il mio codice inizializzando e quindi chiudendo lo scanner - c'è un modo per ottenere input dall'utente senza costruire una classe?
Nearoo,

3
È possibile utilizzare un tentativo con istruzione di risorsa in JDK 8 come; try (Scanner scanner = new Scanner (System.in)) {}
Rune Vikestad,

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

24

Lettura dei dati dalla console

  • BufferedReaderè sincronizzato, quindi le operazioni di lettura su un BufferedReader possono essere eseguite in sicurezza da più thread. È possibile specificare la dimensione del buffer oppure utilizzare la dimensione predefinita ( 8192 ). L'impostazione predefinita è abbastanza grande per la maggior parte degli scopi.

    readLine () « legge i dati riga per riga dallo stream o dalla sorgente. Una linea è considerata terminata da una qualsiasi di queste: \ n, \ r (o) \ r \ n

  • Scannersuddivide i suoi input in token utilizzando un modello delimitatore, che per impostazione predefinita corrisponde agli spazi bianchi (\ s) e viene riconosciuto da Character.isWhitespace.

    « Fino a quando l'utente non immette i dati, l'operazione di scansione potrebbe bloccarsi, in attesa di input. « Utilizzare Scanner ( BUFFER_SIZE = 1024 ) se si desidera analizzare un tipo specifico di token da uno stream. « Uno scanner tuttavia non è sicuro per i thread. Deve essere sincronizzato esternamente.

    next () «Trova e restituisce il prossimo token completo da questo scanner. nextInt () «Scansiona il token successivo dell'input come int.

Codice

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);
}

Ingressi e uscite di Stream

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

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

Questa è ora una risposta migliore, più aggiornata di quella originale.
logicOnAbstractions

Per ulteriori informazioni, consultare: BufferedReader, Scannerleggere i dati da un file di rete (OR) File di rete.
Yash,

14

Si è verificato un problema con il metodo input.nextInt (): legge solo il valore int.

Quindi quando leggi la riga successiva usando input.nextLine () ricevi "\ n", cioè la Enterchiave. Quindi per saltare questo devi aggiungere input.nextLine ().

Provalo così:

 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

Esistono diversi modi per ottenere input dall'utente. Qui in questo programma prenderemo la classe Scanner per raggiungere il compito. Questa classe di scanner rientra java.util, quindi la prima riga del programma è import java.util.Scanner; che consente all'utente di leggere valori di vari tipi in Java. La riga dell'istruzione import dovrebbe essere nella prima riga del programma java e procediamo ulteriormente per il codice.

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

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

Per accedere ai metodi nella classe Scanner, creare un nuovo oggetto scanner come "in". Ora usiamo uno dei suoi metodi, ovvero "next". Il metodo "successivo" ottiene la stringa di testo immessa da un utente sulla tastiera.

Qui sto usando in.nextLine();per ottenere la stringa in cui l'utente inserisce.

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
C'è qualche motivo particolare per cui un nuovo scanner viene creato ogni volta, o è solo copia + incolla senza capire come funziona?
Evgeni Sergeev,

1
@EvgeniSergeev new Scanner è l'oggetto che crei per ottenere l'input dell'utente. leggi di più sulla classe Scanner ...
user3598655

sicuramente copia incollata. Non è necessario un nuovo scanner ogni volta (anche questo non segue la convenzione di denominazione delle variabili java).
Goduto il

6

È possibile creare un semplice programma per chiedere il nome dell'utente e stampare qualunque input utilizzare la risposta.

Oppure chiedi all'utente di inserire due numeri e puoi aggiungere, moltiplicare, sottrarre o dividere quei numeri e stampare le risposte per gli input dell'utente proprio come il comportamento di una calcolatrice.

Quindi lì hai bisogno della classe Scanner. Devi import java.util.Scanner;, e nel codice devi usare:

Scanner input = new Scanner(System.in);

input è un nome variabile.

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

Vedere come questo differisce: input.next();, i = input.nextInt();,d = input.nextDouble();

Secondo una stringa, int e un doppio variano allo stesso modo per il resto. Non dimenticare la dichiarazione di importazione nella parte superiore del codice.


2
Questa è in realtà una spiegazione corretta, ma potrebbe essere meglio se aggiungi altri metodi come nextLine (), nextLong () .. etc
subhashis

Gli studenti devono seguire gli esempi e testare il resto dei metodi e imparare da soli che è ciò che credo sia imparare con la propria esperienza.
user3598655,

4

Un semplice esempio:

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

Quando l'utente inserisce il suo / lei username, controlla anche per l'inserimento valido.

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. Per leggere l'input:

    Scanner scanner = new Scanner(System.in);
    String input = scanner.nextLine();
  2. Per leggere l'input quando si chiama un metodo con alcuni argomenti / parametri:

    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
Dovresti leggere questa pagina di aiuto sulla formattazione del tuo testo / codice: stackoverflow.com/help/formatting .
Tom,

Potresti volerlo tradurre (dal francese?).
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

Ecco la classe completa che esegue l'operazione richiesta:

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
Non c'è motivo di utilizzare più istanze di Scanner.
Radiodef

1

Puoi scorrere questo codice:

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

1
Ciò non fornisce nuove informazioni ed è persino meno utile delle risposte esistenti a causa di spiegazioni mancanti.
Tom,

1
Cosa intendi con "flusso questo codice" ? Vuoi dire "segui questo codice" ? O qualcos'altro?
Peter Mortensen,

0

È possibile utilizzare la classe Scanner in Java

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

0

C'è un modo semplice per leggere dalla console.

Si prega di trovare il seguente codice:

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();
        }
    }

Per una comprensione dettagliata, fare riferimento ai documenti seguenti.

Doc

Ora parliamo della comprensione dettagliata del funzionamento della classe Scanner:

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

Questo è il costruttore per la creazione dell'istanza Scanner.

Qui stiamo passando il InputStreamriferimento che non è altro che a System.In. Qui apre la InputStreampipe per l'input della console.

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);
    }
}

Passando System.in questo codice aprirà il socket per la lettura dalla console.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.