Comment lire les entrées de la console à l'aide de la classe Scanner en Java?


224

Comment puis-je lire les entrées de la console en utilisant la Scannerclasse? Quelque chose comme ça:

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

Fondamentalement, tout ce que je veux, c'est que le scanner lise une entrée pour le nom d'utilisateur et attribue l'entrée à une Stringvariable.



Réponses:


341

Un exemple simple pour illustrer comment java.util.Scannerfonctionne la lecture d'un seul entier System.in. C'est vraiment assez simple.

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

Pour récupérer un nom d'utilisateur, j'utiliserais probablement 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);

Vous pouvez également l'utiliser next(String pattern)si vous voulez plus de contrôle sur l'entrée, ou simplement valider la usernamevariable.

Vous trouverez plus d'informations sur leur implémentation dans la documentation de l' API pourjava.util.Scanner


1
Disons que je n'utilise le scanner qu'une seule fois et que je ne veux pas encombrer mon code en initialisant puis en fermant le scanner - existe-t-il un moyen d'obtenir des entrées de l'utilisateur sans construire de classe?
Nearoo

3
Vous pouvez utiliser une instruction try with resource dans JDK 8 telle que; try (Scanner scanner = nouveau Scanner (System.in)) {}
Rune Vikestad

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

24

Lecture des données à partir de la console

  • BufferedReaderest synchronisé, donc les opérations de lecture sur un BufferedReader peuvent être effectuées en toute sécurité à partir de plusieurs threads. La taille du tampon peut être spécifiée ou la taille par défaut ( 8192 ) peut être utilisée. La valeur par défaut est suffisamment grande pour la plupart des applications.

    readLine () « lit simplement les données ligne par ligne à partir du flux ou de la source. Une ligne est considérée comme terminée par l'un d'eux: \ n, \ r (ou) \ r \ n

  • Scannerdivise son entrée en jetons en utilisant un modèle de délimiteur, qui correspond par défaut aux espaces (\ s) et il est reconnu par Character.isWhitespace.

    « Jusqu'à ce que l'utilisateur entre des données, l'opération de numérisation peut se bloquer, en attente de saisie. « Utilisez Scanner ( BUFFER_SIZE = 1024 ) si vous souhaitez analyser un type spécifique de jeton à partir d'un flux. « Un scanner n'est cependant pas sûr pour les threads. Il doit être synchronisé en externe.

    next () «Recherche et renvoie le prochain jeton complet de ce scanner. nextInt () «Analyse le prochain jeton de l'entrée en tant qu'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);
}

Entrées et sorties de Stream

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

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

C'est maintenant une meilleure réponse, plus à jour que celle d'origine imo.
logicOnAbstractions

Pour plus d'informations, voir: BufferedReader, Scannerpour lire les données d'un fichier réseau de fichier local (OR).
Yash

14

Il y a un problème avec la méthode input.nextInt () - elle ne lit que la valeur int.

Ainsi, lors de la lecture de la ligne suivante en utilisant input.nextLine (), vous recevez "\ n", c'est-à-dire la Enterclé. Donc, pour ignorer cela, vous devez ajouter le input.nextLine ().

Essayez-le comme ça:

 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

Il existe plusieurs façons d'obtenir des informations de l'utilisateur. Ici, dans ce programme, nous prendrons la classe Scanner pour réaliser la tâche. Cette classe Scanner est incluse java.util, donc la première ligne du programme est import java.util.Scanner; qui permet à l'utilisateur de lire des valeurs de différents types en Java. La ligne de déclaration d'importation doit être dans la première ligne du programme java, et nous continuons pour le code.

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

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

Pour accéder aux méthodes de la classe Scanner, créez un nouvel objet scanner comme "in". Maintenant, nous utilisons l'une de ses méthodes, c'est "suivant". La méthode "suivante" obtient la chaîne de texte qu'un utilisateur entre au clavier.

Ici, j'utilise in.nextLine();pour obtenir la chaîne que l'utilisateur entre.

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
Y a-t-il une raison particulière pour laquelle un nouveau scanner est créé à chaque fois, ou est-ce simplement copier-coller sans comprendre comment cela fonctionne?
Evgeni Sergeev

1
@EvgeniSergeev nouveau Scanner est l'objet que vous créez pour obtenir l'entrée utilisateur. en savoir plus sur la classe Scanner ...
user3598655

certainement copier-coller. Il n'y a pas besoin d'un nouveau scanner à chaque fois (cela ne suit pas non plus la convention de dénomination des variables java).
gnomé le

6

Vous pouvez créer un programme simple pour demander le nom de l'utilisateur et imprimer quelles que soient les réponses utilisées.

Ou demandez à l'utilisateur d'entrer deux nombres et vous pouvez ajouter, multiplier, soustraire ou diviser ces nombres et imprimer les réponses pour les entrées utilisateur, tout comme le comportement d'une calculatrice.

Vous avez donc besoin de la classe Scanner. Vous devez import java.util.Scanner;, et dans le code que vous devez utiliser:

Scanner input = new Scanner(System.in);

input est un nom de variable.

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

Voyez comment cela diffère: input.next();, i = input.nextInt();,d = input.nextDouble();

Selon une chaîne, int et un double varient de la même manière pour le reste. N'oubliez pas la déclaration d'importation en haut de votre code.


2
C'est en fait une bonne explication, mais cela pourrait être mieux si vous y ajoutez d'autres méthodes comme nextLine (), nextLong () .. etc
subhashis

Les étudiants doivent suivre les exemples et tester le reste des méthodes et apprendre par eux-mêmes, c'est ce que je pense comme apprendre avec sa propre expérience.
user3598655

4

Un exemple simple:

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

Lorsque l'utilisateur entre son / sa username, vérifiez également l'entrée valide.

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. Pour lire l'entrée:

    Scanner scanner = new Scanner(System.in);
    String input = scanner.nextLine();
  2. Pour lire une entrée lorsque vous appelez une méthode avec certains arguments / paramètres:

    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
Vous devriez lire cette page d'aide sur la mise en forme de votre texte / code: stackoverflow.com/help/formatting .
Tom

Vous voudrez peut-être le traduire (du français?).
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

Voici la classe complète qui effectue l'opération requise:

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
Il n'y a aucune raison d'utiliser plusieurs instances de Scanner.
Radiodef

1

Vous pouvez diffuser ce code:

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

1
Cela ne fournit pas de nouvelles informations et est encore moins utile que les réponses existantes en raison d'explications manquantes.
Tom

1
Qu'entendez-vous par «diffuser ce code» ? Tu veux dire "suivez ce code" ? Ou autre chose?
Peter Mortensen

0

Vous pouvez utiliser la classe Scanner en Java

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

0

Il existe un moyen simple de lire à partir de la console.

Veuillez trouver le code ci-dessous:

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

Pour une compréhension détaillée, veuillez vous référer aux documents ci-dessous.

Doc

Parlons maintenant de la compréhension détaillée du fonctionnement de la classe Scanner:

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

Il s'agit du constructeur pour la création de l'instance Scanner.

Nous passons ici la InputStreamréférence qui n'est rien d'autre qu'un System.In. Ici, il ouvre le InputStreamcanal d'entrée de 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);
    }
}

En passant le System.in ce code ouvrira le socket pour la lecture depuis la console.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.