¿Cómo obtener la entrada del usuario en Java?


318

Intenté crear una calculadora, pero no puedo hacer que funcione porque no sé cómo obtener información del usuario .

¿Cómo puedo obtener la entrada del usuario en Java?


8
¿Cuál es tu pregunta? Acabas de publicar un código y dijiste que no te gustan los punteros. No entender los punteros puede volver a morderte en Java si no entiendes pasar por referencia y pasar por valor.
Scott

44
deberías tratar de aprender Java leyendo un libro, Java How to Program, 7 / e es agradable
Marco Aviles

Respuestas:


334

Puede usar cualquiera de las siguientes opciones según los requisitos.

Scanner clase

import java.util.Scanner; 
Scanner scan = new Scanner(System.in);
String s = scan.next();
int i = scan.nextInt();

BufferedReadery InputStreamReaderclases

import java.io.BufferedReader;
import java.io.InputStreamReader;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
int i = Integer.parseInt(s);

DataInputStream clase

import java.io.DataInputStream;
DataInputStream dis = new DataInputStream(System.in);
int i = dis.readInt();

El readLinemétodo de la DataInputStreamclase ha quedado en desuso . Para obtener el valor de cadena, debe usar la solución anterior con BufferedReader


Console clase

import java.io.Console;
Console console = System.console();
String s = console.readLine();
int i = Integer.parseInt(console.readLine());

Aparentemente, este método no funciona bien en algunos IDE.


44
Tenga en cuenta que DataInputStreames para leer datos binarios. Utilizando readIntel System.inno no analizar un número entero de los datos de caracteres, será lugar reinterpretar los valores Unicode y sin sentido de retorno. Ver DataInput#readIntpara más detalles ( DataInputStreamimplementos DataInput).
Radiodef

3
esto es genial, me encantaría ver las importaciones requeridas agregadas para completar. También realmente ayudaría a quienes lo necesitan.
KnightHawk

1
Esta respuesta sería mucho más útil si mencionara cuáles eran realmente los requisitos. He comenzado una recompensa para tratar de arreglar esto.
temporary_user_name

405

Una de las formas más simples es usar un Scannerobjeto de la siguiente manera:

import java.util.Scanner;

Scanner reader = new Scanner(System.in);  // Reading from System.in
System.out.println("Enter a number: ");
int n = reader.nextInt(); // Scans the next token of the input as an int.
//once finished
reader.close();

13
Si cierra un objeto Scanner abierto en System.in, no podrá volver a abrir System.in hasta que finalice el programa.
ksnortum

@ksnortum ¿puedo volver a abrir Scanner reader1 = new Scanner(System.in);?
Abhijit Jagtap

Intentalo. No lo creo.
ksnortum

1
Sí, ksnortum tiene razón, obtienes una NoSuchElementException. Pregunta relacionada algo útil sobre por qué no puede volver a abrir System.in después de cerrarlo .
temporary_user_name

45

Puedes usar la clase Scanner o la clase Console

Console console = System.console();
String input = console.readLine("Enter input:");

55
Creo que System.console devolverá nulo si este código se ejecuta desde eclipse.
Win Coder

13
Creo que esto devolverá un error que se ejecuta desde casi cualquier IDE. confirmó que intelliJ está teniendo el mismo problema.
Dan Bradbury

1
pero ¿por qué es esto un nulo en eclipse?
Mark W

20

Puede obtener la entrada del usuario utilizando BufferedReader.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String accStr;  

System.out.println("Enter your Account number: ");
accStr = br.readLine();

Almacenará un Stringvalor en, accStrpor lo que debe analizarlo en un intuso Integer.parseInt.

int accInt = Integer.parseInt(accStr);

17

Aquí es cómo puede obtener las entradas del teclado:

Scanner scanner = new Scanner (System.in);
System.out.print("Enter your name");  
name = scanner.next(); // Get what the user types.

14

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

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

Entonces allí necesitas la clase Scanner. Tienes que import java.util.Scanner;y en el código que necesitas usar

Scanner input = new Scanner(System.in);

La entrada 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.

Consulte también la publicación del blog "Clase de escáner y obtención de entradas de usuario" .


12

Las dos mejores opciones son BufferedReadery Scanner.

El método más utilizado es Scannery personalmente lo prefiero debido a su simplicidad y fácil implementación, así como a su poderosa utilidad para analizar texto en datos primitivos.

Ventajas de usar el escáner

  • Fácil de usar la Scannerclase
  • Fácil entrada de números (int, short, byte, float, long y double)
  • Las excepciones no están marcadas, lo cual es más conveniente. Depende del programador ser civilizado y especificar o capturar las excepciones.
  • Puede leer líneas, espacios en blanco y tokens delimitados por expresiones regulares.

Ventajas de BufferedInputStream


En general, cada método de entrada tiene diferentes propósitos.

  • Si está ingresando una gran cantidad de datos, BufferedReaderpodría ser mejor para usted

  • Si está ingresando muchos números Scanner, el análisis automático es muy conveniente

Para usos más básicos, recomendaría el Scannerporque es más fácil de usar y es más fácil escribir programas. Aquí hay un ejemplo rápido de cómo crear un Scanner. Proporcionaré un ejemplo completo a continuación sobre cómo usar elScanner

Scanner scanner = new Scanner (System.in); // create scanner
System.out.print("Enter your name");       // prompt user
name = scanner.next();                     // get user input

(Para obtener más información sobre BufferedReaderver Cómo utilizar un BufferedReader y ver las líneas de lectura de Caracteres )


java.util.Scanner

import java.util.InputMismatchException; // import the exception catching class
import java.util.Scanner; // import the scanner class

public class RunScanner {

    // main method which will run your program
    public static void main(String args[]) {

        // create your new scanner
        // Note: since scanner is opened to "System.in" closing it will close "System.in". 
        // Do not close scanner until you no longer want to use it at all.
        Scanner scanner = new Scanner(System.in);

        // PROMPT THE USER
        // Note: when using scanner it is recommended to prompt the user with "System.out.print" or "System.out.println"
        System.out.println("Please enter a number");

        // use "try" to catch invalid inputs
        try {

            // get integer with "nextInt()"
            int n = scanner.nextInt();


            System.out.println("Please enter a decimal"); // PROMPT
            // get decimal with "nextFloat()"
            float f = scanner.nextFloat();


            System.out.println("Please enter a word"); // PROMPT
            // get single word with "next()"
            String s = scanner.next();

            // ---- Note: Scanner.nextInt() does not consume a nextLine character /n 
            // ---- In order to read a new line we first need to clear the current nextLine by reading it:
            scanner.nextLine(); 
            // ----
            System.out.println("Please enter a line"); // PROMPT
            // get line with "nextLine()"
            String l = scanner.nextLine();


            // do something with the input
            System.out.println("The number entered was: " + n);
            System.out.println("The decimal entered was: " + f);
            System.out.println("The word entered was: " + s);
            System.out.println("The line entered was: " + l);


        }
        catch (InputMismatchException e) {
            System.out.println("\tInvalid input entered. Please enter the specified input");
        }

        scanner.close(); // close the scanner so it doesn't leak
    }
}

Nota: Otras clases como Consoley DataInputStreamtambién son alternativas viables.

Consoletiene algunas características poderosas, como la capacidad de leer contraseñas, sin embargo, no está disponible en todos los IDE (como Eclipse). La razón de esto ocurre porque Eclipse ejecuta su aplicación como un proceso en segundo plano y no como un proceso de nivel superior con una consola del sistema. Aquí hay un enlace a un ejemplo útil sobre cómo implementar la Consoleclase.

DataInputStreamse usa principalmente para leer la entrada como un tipo de datos primitivo, desde un flujo de entrada subyacente, de forma independiente de la máquina. DataInputStreamgeneralmente se usa para leer datos binarios. También proporciona métodos convenientes para leer ciertos tipos de datos. Por ejemplo, tiene un método para leer una cadena UTF que puede contener cualquier número de líneas dentro de ellas.

Sin embargo, es una clase más complicada y más difícil de implementar, por lo que no se recomienda para principiantes. Aquí hay un enlace a un ejemplo útil de cómo implementar a DataInputStream.


Voy a seguir adelante y llamar al ganador aquí. En general, una respuesta bastante buena, aunque desearía profundizar en cuándo me gustaría usarla DataInputStream; la descripción allí parece idéntica al caso de uso para Scanner: leer datos en primitivos. Además, si alguien se encuentra en la etapa en la que no sabe cómo obtener información del usuario, lo más probable es que tampoco entienda por qué algunas partes de la biblioteca estándar no estarán disponibles en ciertos IDE. Ciertamente ese es el caso para mí, ¿por qué Consoleno está disponible?
temporary_user_name

1
Gracias por sus comentarios. He intentado actualizar para incluir más aclaraciones. Consulte quora.com/… y stackoverflow.com/questions/27601520/…
JFreeman el

Perfecto. Ahora, esta es exactamente la respuesta que esta pregunta siempre necesitó. Si solo hubiera alguna forma de llegar a la cima.
temporary_user_name

Bueno, cualquiera que esté dispuesto a desplazarse hacia abajo obtendrá una buena respuesta y lentamente subirá :)
JFreeman

1
Gracias. Respuesta informativa detallada. Agregar try-with-resourcelo haría mejor.
Sourabh

8

Aquí, el programa le pide al usuario que ingrese un número. Después de eso, el programa imprime los dígitos del número y la suma de los dígitos.

import java.util.Scanner;

public class PrintNumber {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int num = 0;
        int sum = 0;

        System.out.println(
            "Please enter a number to show its digits");
        num = scan.nextInt();

        System.out.println(
            "Here are the digits and the sum of the digits");
        while (num > 0) {
            System.out.println("==>" + num % 10);
            sum += num % 10;
            num = num / 10;   
        }
        System.out.println("Sum is " + sum);            
    }
}

8

Para leer una línea o una cadena, puede usar un BufferedReaderobjeto combinado con InputStreamReaderuno de la siguiente manera:

BufferedReader bufferReader = new BufferedReader(new InputStreamReader(System.in));
String inputLine = bufferReader.readLine();

6

Aquí está su programa de la pregunta usando java.util.Scanner:

import java.util.Scanner;

public class Example {
    public static void main(String[] args) {
        int input = 0;
        System.out.println("The super insano calculator");
        System.out.println("enter the corrosponding number:");
        Scanner reader3 = new Scanner(System.in);
        System.out.println(
            "1. Add | 2. Subtract | 3. Divide | 4. Multiply");

        input = reader3.nextInt();

        int a = 0, b = 0;

        Scanner reader = new Scanner(System.in);
        System.out.println("Enter the first number");
        // get user input for a
        a = reader.nextInt();

        Scanner reader1 = new Scanner(System.in);
        System.out.println("Enter the scend number");
        // get user input for b
        b = reader1.nextInt();

        switch (input){
            case 1:  System.out.println(a + " + " + b + " = " + add(a, b));
                     break;
            case 2:  System.out.println(a + " - " + b + " = " + subtract(a, b));
                     break;
            case 3:  System.out.println(a + " / " + b + " = " + divide(a, b));
                     break;
            case 4:  System.out.println(a + " * " + b + " = " + multiply(a, b));
                     break;
            default: System.out.println("your input is invalid!");
                     break;
        }
    }

    static int      add(int lhs, int rhs) { return lhs + rhs; }
    static int subtract(int lhs, int rhs) { return lhs - rhs; }
    static int   divide(int lhs, int rhs) { return lhs / rhs; }
    static int multiply(int lhs, int rhs) { return lhs * rhs; }
}

3
No hay necesidad de crear tantos Scannerobjetos; uno hubiera sido suficiente.
jub0bs

5

Use la Systemclase para obtener la entrada.

http://fresh2refresh.com/java-tutorial/java-input-output/ :

¿Cómo se aceptan los datos del teclado?

Necesitamos tres objetos,

  1. System.in
  2. InputStreamReader
  3. BufferedReader

    • InputStreamReader y BufferedReader son clases en el paquete java.io.
    • System.in, que es un objeto InputStream, recibe los datos en forma de bytes desde el teclado.
    • Luego, InputStreamReader lee bytes y los decodifica en caracteres.
    • Luego, finalmente, el objeto BufferedReader lee el texto de una secuencia de entrada de caracteres, almacenando caracteres en búfer para proporcionar una lectura eficiente de caracteres, matrices y líneas.
InputStreamReader inp = new InputStreamReader(system.in);
BufferedReader br = new BufferedReader(inp);

1
System.in(int la primera línea de código) tendrá capital Spara el nombre de la clase.
KNU

5
Entrada del escáner = nuevo escáner (System.in);
int entero = input.nextInt ();
Cadena cadena = input.next ();
long longInteger = input.nextLong ();

5

Solo un detalle extra. Si no desea arriesgarse a una pérdida de memoria / recursos, debe cerrar la secuencia del escáner cuando haya terminado:

myScanner.close();

Tenga en cuenta que Java 1.7 y versiones posteriores captan esto como una advertencia de compilación (no pregunte cómo sé eso :-)


Pero no si Scanner está abierto a System.in. No podrá volver a abrir Scanner to System.in nuevamente en su programa.
ksnortum

4
Scanner input = new Scanner(System.in);
String inputval = input.next();

4
import java.util.Scanner; 

class Daytwo{
    public static void main(String[] args){
        System.out.println("HelloWorld");

        Scanner reader = new Scanner(System.in);
        System.out.println("Enter the number ");

        int n = reader.nextInt();
        System.out.println("You entered " + n);

    }
}

4

Aquí hay una versión más desarrollada de la respuesta aceptada que aborda dos necesidades comunes:

  • Recopilar la entrada del usuario repetidamente hasta que se haya ingresado un valor de salida
  • Manejo de valores de entrada no válidos (no enteros en este ejemplo)

Código

package inputTest;

import java.util.Scanner;
import java.util.InputMismatchException;

public class InputTest {
    public static void main(String args[]) {
        Scanner reader = new Scanner(System.in);
        System.out.println("Please enter integers. Type 0 to exit.");

        boolean done = false;
        while (!done) {
            System.out.print("Enter an integer: ");
            try {
                int n = reader.nextInt();
                if (n == 0) {
                    done = true;
                }
                else {
                    // do something with the input
                    System.out.println("\tThe number entered was: " + n);
                }
            }
            catch (InputMismatchException e) {
                System.out.println("\tInvalid input type (must be an integer)");
                reader.nextLine();  // Clear invalid input from scanner buffer.
            }
        }
        System.out.println("Exiting...");
        reader.close();
    }
}

Ejemplo

Please enter integers. Type 0 to exit.
Enter an integer: 12
    The number entered was: 12
Enter an integer: -56
    The number entered was: -56
Enter an integer: 4.2
    Invalid input type (must be an integer)
Enter an integer: but i hate integers
    Invalid input type (must be an integer)
Enter an integer: 3
    The number entered was: 3
Enter an integer: 0
Exiting...

Tenga en cuenta que sin nextLine(), la entrada incorrecta activará la misma excepción repetidamente en un bucle infinito. Es posible que desee usar next()en su lugar según las circunstancias, pero sepa que las entradas como this has spacesgenerarán múltiples excepciones.


3

Agregar throws IOExceptional lado main(), luego

DataInputStream input = new DataInputStream(System.in);
System.out.print("Enter your name");
String name = input.readLine();

3

Es muy sencillo obtener información en Java, todo lo que tiene que hacer es:

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

es lo mismo. Siempre puede inicializar una matriz con el tipo de datos varName [] O el tipo de datos [] varName
user2277872

3
import java.util.Scanner;

public class Myapplication{
     public static void main(String[] args){
         Scanner in = new Scanner(System.in);
         int a;
         System.out.println("enter:");
         a = in.nextInt();
         System.out.println("Number is= " + a);
     }
}

2

Puede obtener una entrada del usuario como esta usando un BufferedReader:

    InputStreamReader inp = new InputStreamReader(System.in);
    BufferedReader br = new BufferedReader(inp);
    // you will need to import these things.

Así es como los aplicas

    String name = br.readline(); 

Entonces, cuando el usuario escribe su nombre en la consola, "String name" almacenará esa información.

Si es un número que desea almacenar, el código se verá así:

    int x = Integer.parseInt(br.readLine());

¡Espero que esto ayude!


2

Puede ser algo como esto ...

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

    System.out.println("Enter a number: ");
    int i = reader.nextInt();
    for (int j = 0; j < i; j++)
        System.out.println("I love java");
}

1

Este es un código simple que usa la System.in.read()función. Este código solo escribe lo que se haya escrito. Puede deshacerse del ciclo while si solo desea tomar una entrada una vez, y podría almacenar las respuestas en una matriz de caracteres si así lo desea.

package main;

import java.io.IOException;

public class Root 
{   
    public static void main(String[] args)
    {
        new Root();
    }

    public Root()
    {
        while(true)
        {
            try
            {
                for(int y = 0; y < System.in.available(); ++y)
                { 
                    System.out.print((char)System.in.read()); 
                }
            }
            catch(IOException ex)
            {
                ex.printStackTrace(System.out);
                break;
            }
        }
    }   
}    

1

Me gusta lo siguiente:

public String readLine(String tPromptString) {
    byte[] tBuffer = new byte[256];
    int tPos = 0;
    System.out.print(tPromptString);

    while(true) {
        byte tNextByte = readByte();
        if(tNextByte == 10) {
            return new String(tBuffer, 0, tPos);
        }

        if(tNextByte != 13) {
            tBuffer[tPos] = tNextByte;
            ++tPos;
        }
    }
}

y por ejemplo, haría:

String name = this.readLine("What is your name?")

1
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        System.out.println("Welcome to the best program in the world! ");
        while (true) {
            System.out.print("Enter a query: ");
            Scanner scan = new Scanner(System.in);
            String s = scan.nextLine();
            if (s.equals("q")) {
                System.out.println("The program is ending now ....");
                break;
            } else  {
                System.out.println("The program is running...");
            }
        }
    }
}

0

Puede obtener la entrada del usuario usando Scanner. Puede utilizar la validación de entrada adecuada utilizando métodos adecuados para diferentes tipos de datos como next()for Stringo nextInt()for Integer.

import java.util.Scanner;

Scanner scanner = new Scanner(System.in);

//reads the input until it reaches the space
System.out.println("Enter a string: ");
String str = scanner.next();
System.out.println("str = " + str);

//reads until the end of line
String aLine = scanner.nextLine();

//reads the integer
System.out.println("Enter an integer num: ");
int num = scanner.nextInt();
System.out.println("num = " + num);

//reads the double value
System.out.println("Enter a double: ");
double aDouble = scanner.nextDouble();
System.out.println("double = " + aDouble);


//reads the float value, long value, boolean value, byte and short
double aFloat = scanner.nextFloat();
long aLong = scanner.nextLong();
boolean aBoolean = scanner.nextBoolean();
byte aByte = scanner.nextByte();
short aShort = scanner.nextShort();

scanner.close();

0

La forma más sencilla de obtener la entrada del usuario sería usar el escáner. Aquí hay un ejemplo de cómo se supone que debe usarse:

import java.util.Scanner;
public class main {
public static void main(String[]args) {
Scanner sc=new Scanner(System.in);
int a;
String b;
System.out.println("Type an integer here: ");
a=sc.nextInt();
System.out.println("Type anything here:");
b=sc.nextLine();

La línea de código import java.util.Scanner;le dice al programa que el programador usará las entradas del usuario en su código. Como dice, importa la utilidad del escáner. Scanner sc=new Scanner(System.in);le dice al programa que inicie las entradas del usuario. Después de hacer eso, debe hacer una cadena o un entero sin un valor, luego ponerlos en la línea a=sc.nextInt();o a=sc.nextLine();. Esto le da a las variables el valor de las entradas del usuario. Entonces puedes usarlo en tu código. Espero que esto ayude.


-1
import java.util.Scanner;

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

        System.out.print("Name : ");
        String name = input.next();
        System.out.print("Last Name : ");
        String lname = input.next();
        System.out.print("Age : ");
        byte age = input.nextByte();

        System.out.println(" " );
        System.out.println(" " );

        System.out.println("Firt Name: " + name);
        System.out.println("Last Name: " + lname);
        System.out.println("      Age: " + age);
    }
}

-1
class ex1 {    
    public static void main(String args[]){
        int a, b, c;
        a = Integer.parseInt(args[0]);
        b = Integer.parseInt(args[1]);
        c = a + b;
        System.out.println("c = " + c);
    }
}
// Output  
javac ex1.java
java ex1 10 20 
c = 30

La sanción por acceder a elementos de argssin verificar primero la longitud de esa matriz: voto negativo.
jub0bs


-1

La entrada del teclado usando el escáner es posible, como han publicado otros. Pero en estos tiempos altamente gráficos no tiene sentido hacer una calculadora sin una interfaz gráfica de usuario (GUI).

En Java moderno, esto significa usar una herramienta de arrastrar y soltar JavaFX como Scene Builder para diseñar una GUI que se parezca a la consola de una calculadora. Tenga en cuenta que usar Scene Builder es intuitivamente fácil y no requiere ninguna habilidad adicional de Java para sus controladores de eventos que lo que ya puede tener.

Para la entrada del usuario, debe tener un TextField ancho en la parte superior de la consola GUI.

Aquí es donde el usuario ingresa los números en los que desea realizar funciones. Debajo de TextField, tendría una serie de botones de función que realizan funciones básicas (es decir, sumar / restar / multiplicar / dividir y memoria / recuperar / borrar). Una vez que se ha establecido la GUI, puede agregar las referencias de 'controlador' que vinculan cada función de botón a su implementación de Java, por ejemplo, una llamada al método en la clase de controlador de su proyecto.

Este video es un poco antiguo pero aún muestra lo fácil que es usar Scene Builder.


Esta respuesta ha sido rechazada, no se ha dado ninguna razón. Para mí, es la única forma útil de obtener la entrada del usuario en una aplicación Java.
Tronco

Esto es muy útil, y no veo por qué fue rechazado. Sin embargo, las respuestas actuales y la declaración de recompensa implican que están buscando una respuesta para futuros usuarios que quieran obtener información a través de una consola.
JFreeman

Simplemente no veo ningún usuario de Java, salvo aquellos atascados con código escrito en versiones antiguas de Java, que tengan algún uso para la entrada del teclado del escáner. La última vez que estoy respondiendo una publicación vinculada a la recompensa. . .
Tronco

Entiendo tu queja por completo. Personalmente, creo que su respuesta es muy útil, así que no entiendo por qué fue rechazada. Sin embargo, en muchas ocasiones he escrito programas que no tienen GUI y, por lo tanto, creo que Scanneres muy bueno tener disponible el código adecuado para a.
JFreeman

Si el OP dijo que era un proceso de baja sobrecarga (¿incrustado?) Con E / S de pantalla mínima o nula, lo suficientemente justo: el escáner es lo que necesitan. Pero no declararon tal cosa. El OP esencialmente nos pidió que aceptemos que esta frase, "entrada del usuario", principalmente sugiere la entrada del teclado o bien nos invitó a interpretar la frase por nosotros mismos. . .
Tronco
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.