¿Cómo puedo leer la entrada de la consola usando la clase Scanner en Java?


224

¿Cómo podría leer la entrada de la consola usando la Scannerclase? Algo como esto:

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

Básicamente, todo lo que quiero es que el escáner lea una entrada para el nombre de usuario y asigne la entrada a una Stringvariable.



Respuestas:


341

Un ejemplo simple para ilustrar cómo java.util.Scannerfunciona sería leer un solo entero System.in. Es realmente bastante simple.

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

Para recuperar un nombre de usuario, probablemente usaría 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);

También podría usarlo next(String pattern)si desea tener más control sobre la entrada, o simplemente validar la usernamevariable.

Encontrará más información sobre su implementación en la Documentación API parajava.util.Scanner


1
Digamos que solo uso el escáner una vez y no quiero saturar mi código inicializando y luego cerrando el escáner. ¿Hay alguna manera de obtener información del usuario sin construir una clase?
Nearoo

3
Puede usar una declaración de prueba con recurso en JDK 8 como; try (Scanner scanner = new Scanner (System.in)) {}
Rune Vikestad

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

24

Leer datos desde la consola

  • BufferedReaderestá sincronizado, por lo que las operaciones de lectura en un BufferedReader se pueden realizar de forma segura desde varios subprocesos Se puede especificar el tamaño del búfer o se puede usar el tamaño predeterminado ( 8192 ). El valor predeterminado es lo suficientemente grande para la mayoría de los propósitos.

    readLine () « solo lee datos línea por línea de la secuencia o fuente. Una línea se considera terminada por cualquiera de estos: \ n, \ r (o) \ r \ n

  • Scannerdivide su entrada en tokens usando un patrón delimitador, que por defecto coincide con espacios en blanco (\ s) y es reconocido por Character.isWhitespace.

    « Hasta que el usuario ingrese datos, la operación de escaneo puede bloquearse, esperando la entrada. « Utilice el escáner ( BUFFER_SIZE = 1024 ) si desea analizar un tipo específico de token de una secuencia. « Sin embargo, un escáner no es seguro para subprocesos. Tiene que estar sincronizado externamente.

    next () «Encuentra y devuelve el siguiente token completo de este escáner. nextInt () «Escanea el siguiente token de la entrada como int.

Código

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

Entradas y salidas de Stream

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

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

Esta es ahora una respuesta mejor y más actualizada que la respuesta original.
logicOnAbstraction

Para obtener más información, consulte: BufferedReader, Scannerpara leer datos de un archivo de red de archivo local (OR).
Yash

14

Hay un problema con el método input.nextInt (): solo lee el valor int.

Entonces, al leer la siguiente línea usando input.nextLine (), recibe "\ n", es decir, la Enterclave. Entonces, para omitir esto, debe agregar input.nextLine ().

Pruébalo así:

 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

Hay varias formas de obtener información del usuario. Aquí en este programa tomaremos la clase Scanner para lograr la tarea. Esta clase de escáner se incluye java.util, por lo tanto, la primera línea del programa es import java.util.Scanner; que permite al usuario leer valores de varios tipos en Java. La línea de la declaración de importación debería estar en la primera línea del programa de Java, y procederemos a buscar el código.

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

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

Para acceder a los métodos en la clase Scanner, cree un nuevo objeto de escáner como "in". Ahora usamos uno de sus métodos, que es "siguiente". El método "siguiente" obtiene la cadena de texto que un usuario ingresa en el teclado.

Aquí estoy usando in.nextLine();para obtener la cadena que ingresa el usuario.

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

55
¿Hay alguna razón particular por la que se crea un nuevo escáner cada vez, o es solo copiar + pegar sin entender cómo funciona?
Evgeni Sergeev

1
@EvgeniSergeev new Scanner es el objeto que crea para obtener la entrada del usuario. lea más sobre la clase de escáner ...
user3598655

Definitivamente copia pegada. No es necesario un nuevo escáner cada vez (esto tampoco sigue la convención de nomenclatura de variables de Java).
gnomed

6

Puede hacer un programa simple para pedir el nombre del usuario e imprimir cualquier entrada que use la respuesta.

O pídale al usuario que ingrese dos números y usted puede sumar, multiplicar, restar o dividir esos números e imprimir las respuestas para las entradas del usuario al igual que el comportamiento de una calculadora.

Entonces allí necesitas la clase Scanner. Tiene que hacerlo import java.util.Scanner;, y en el código que necesita usar:

Scanner input = new Scanner(System.in);

input es un nombre 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

Ver en qué se diferencia: input.next();, i = input.nextInt();,d = input.nextDouble();

Según una cadena, int y un doble varían de la misma manera para el resto. No olvide la declaración de importación en la parte superior de su código.


2
Esta es en realidad una explicación adecuada, pero podría ser mejor si le agregas algunos métodos más como nextLine (), nextLong () .. etc
subhashis

Los estudiantes deben seguir los ejemplos y probar el resto de los métodos y aprender por sí mismos, eso es lo que creo que es aprender con experiencia propia.
user3598655

4

Un simple ejemplo:

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

Cuando el usuario ingresa su / ella username, verifique también la entrada válida.

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. Para leer la entrada:

    Scanner scanner = new Scanner(System.in);
    String input = scanner.nextLine();
  2. Para leer la entrada cuando llama a un método con algunos argumentos / parámetros:

    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
Debe leer esta página de ayuda sobre el formato de su texto / código: stackoverflow.com/help/formatting .
Tom

Es posible que desee traducirlo (¿del francés?).
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

Aquí está la clase completa que realiza la operación requerida:

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
No hay razón para usar varias instancias de Scanner.
Radiodef

1

Puedes hacer fluir este código:

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

1
Esto no proporciona información nueva y es aún menos útil que las respuestas existentes debido a las explicaciones que faltan.
Tom

1
¿Qué quieres decir con "fluir este código" ? ¿Te refieres a "seguir este código" ? ¿O algo mas?
Peter Mortensen

0

Puedes usar la clase Scanner en Java

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

0

Hay una manera simple de leer desde la consola.

Por favor encuentre el siguiente código:

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

Para una comprensión detallada, consulte los siguientes documentos.

Doc

Ahora hablemos sobre la comprensión detallada del funcionamiento de la clase Scanner:

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

Este es el constructor para crear la instancia de Scanner.

Aquí estamos pasando la InputStreamreferencia que no es más que a System.In. Aquí abre el InputStreamPipe para la entrada de la consola.

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

Al pasar System.in, este código abrirá el socket para leer desde la consola.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.