Como obter a entrada do usuário em Java?


317

Tentei criar uma calculadora, mas não consigo fazê-la funcionar porque não sei como obter informações do usuário .

Como posso obter a entrada do usuário em Java?


8
Qual a sua pergunta? Você acabou de publicar um código e disse que não gosta de ponteiros. Não entender os ponteiros ainda pode voltar a mordê-lo em java se você não entender passar por referência e passar por valor.
13133 Scott

4
você deve tentar aprender java lendo um livro, Java como programar, 7 / e é uma agradável
Marco Aviles

Respostas:


333

Você pode usar qualquer uma das seguintes opções com base nos requisitos.

Scanner classe

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

BufferedReadere InputStreamReaderaulas

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 classe

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

O readLinemétodo da DataInputStreamclasse foi preterido . Para obter o valor String, você deve usar a solução anterior com BufferedReader


Console classe

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

Aparentemente, esse método não funciona bem em alguns IDEs.


4
Observe que DataInputStreamé para ler dados binários. Usando readIntem System.inque não analisar um número inteiro a partir dos dados de caracteres, ele irá em vez reinterpretar os valores unicode e absurdo retorno. Veja DataInput#readIntpara detalhes ( DataInputStreamimplementos DataInput).
Radiodef 05/04

3
isso é ótimo, gostaria de ver as importações necessárias adicionadas para garantir a integridade. Também realmente ajudaria aqueles que precisam.
KnightHawk

1
Essa resposta seria muito mais útil se mencionasse quais eram realmente os requisitos. Eu comecei uma recompensa para tentar consertar isso.
temporary_user_name

405

Uma das maneiras mais simples é usar um Scannerobjeto da seguinte maneira:

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
Se você fechar um objeto Scanner aberto para System.in, não poderá reabri-lo até que o programa seja concluído.
precisa saber é o seguinte

@ksnortum posso reabrir por Scanner reader1 = new Scanner(System.in);?
Abhijit Jagtap

Tente. Acho que não.
Ksnortum

1
Sim, o ksnortum está certo, você recebe uma NoSuchElementException. Pergunta relacionada um pouco útil sobre por que você não pode reabrir o System.in após fechá-lo .
temporary_user_name

45

Você pode usar a classe Scanner ou a classe Console

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

55
Eu acho que System.console retornará nulo se esse código for executado a partir do eclipse.
Win Coder

13
Acredito que isso retornará um erro sendo executado em praticamente qualquer IDE. confirmou que intelliJ está tendo o mesmo problema.
Dan Bradbury

1
mas por que isso é nulo no eclipse?
Mark W

20

Você pode obter informações do usuário usando BufferedReader.

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

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

Ele armazenará um Stringvalor em, accStrportanto, você precisará analisá-lo para um intuso Integer.parseInt.

int accInt = Integer.parseInt(accStr);

17

Aqui está como você pode obter as entradas do teclado:

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

14

Você pode criar um programa simples para solicitar o nome do usuário e imprimir o que quer que a resposta use entradas.

Ou peça ao usuário para digitar dois números e você pode adicionar, multiplicar, subtrair ou dividir esses números e imprimir as respostas para as entradas do usuário, exatamente como o comportamento de uma calculadora.

Então, aí você precisa da classe Scanner. Você precisa import java.util.Scanner;e no código que precisa usar

Scanner input = new Scanner(System.in);

Entrada é um nome de variável.

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

Veja como isso é diferente: input.next();, i = input.nextInt();,d = input.nextDouble();

De acordo com uma String, int e um double variam da mesma maneira para o resto. Não esqueça a declaração de importação na parte superior do seu código.

Consulte também a postagem do blog "Classe de scanner e obtenção de entradas do usuário" .


12

As duas melhores opções são BufferedReadere Scanner.

O método mais usado é Scannere eu pessoalmente o prefiro devido à sua simplicidade e fácil implementação, além de seu poderoso utilitário para analisar o texto em dados primitivos.

Vantagens de usar o scanner

  • Fácil de usar o Scanner classe
  • Entrada fácil de números (int, curto, byte, flutuante, longo e duplo)
  • As exceções são desmarcadas, o que é mais conveniente. Depende do programador ser civilizado e especificar ou capturar as exceções.
  • É capaz de ler linhas, espaços em branco e tokens delimitados por expressões regulares

Vantagens do BufferedInputStream


No geral, cada método de entrada tem finalidades diferentes.

  • Se você estiver inserindo uma grande quantidade de dados, BufferedReaderpoderá ser melhor para você

  • Se você está digitando muitos números, Scannerfaz uma análise automática, o que é muito conveniente

Para usos mais básicos, eu recomendaria o, Scannerporque é mais fácil de usar e mais fácil escrever programas. Aqui está um exemplo rápido de como criar um Scanner. Vou fornecer um exemplo abrangente abaixo de como usar oScanner

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

(Para obter mais informações sobre BufferedReaderconsulte Como usar um BufferedReader e consulte Lendo linhas 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: Outras classes como Consolee DataInputStreamtambém são alternativas viáveis.

Consolepossui alguns recursos poderosos, como a capacidade de ler senhas, no entanto, não está disponível em todos os IDEs (como o Eclipse). O motivo disso ocorre porque o Eclipse executa seu aplicativo como um processo em segundo plano e não como um processo de nível superior com um console do sistema. Aqui está um link para um exemplo útil de como implementar a Consoleclasse.

DataInputStreamé usado principalmente para ler entrada como um tipo de dados primitivo, de um fluxo de entrada subjacente, de maneira independente da máquina. DataInputStreamé geralmente usado para ler dados binários. Ele também fornece métodos de conveniência para a leitura de certos tipos de dados. Por exemplo, ele possui um método para ler uma String UTF que pode conter qualquer número de linhas dentro delas.

No entanto, é uma classe mais complicada e mais difícil de implementar, por isso não é recomendado para iniciantes. Aqui está um link para um exemplo útil de como implementar a DataInputStream.


Vou seguir em frente e chamar o vencedor aqui. Principalmente uma ótima resposta, embora eu desejasse que fosse mais aprofundado sobre quando eu gostaria de usar DataInputStream- a descrição lá parece idêntica ao caso de uso para Scanner: ler dados em primitivos. Além disso, se alguém está no estágio em que não sabe como obter informações do usuário, provavelmente também não entende por que algumas partes da biblioteca padrão não estariam disponíveis em determinados IDEs. Certamente esse é o meu caso - por que Consolenão está disponível?
temporary_user_name

1
Obrigado pelo seu feedback. Tentei atualizar para incluir mais esclarecimentos. Veja quora.com/… e stackoverflow.com/questions/27601520/…
JFreeman

Perfeito. Agora, essa é exatamente a resposta que essa pergunta precisava o tempo todo. Se ao menos houvesse alguma maneira de chegar ao topo.
temporary_user_name

Bem, quem está disposto para rolar para baixo vai ter uma boa resposta e, lentamente, ele vai subir :)
JFreeman

1
Obrigado. Resposta informativa detalhada. Adicionar try-with-resourceseria melhor.
Sourabh

8

Aqui, o programa solicita que o usuário insira um número. Depois disso, o programa imprime os dígitos do número e a soma dos 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 ler uma linha ou string, você pode usar um BufferedReaderobjeto combinado com um da InputStreamReaderseguinte maneira:

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

6

Aqui está o seu programa da pergunta 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
Não há necessidade de criar tantos Scannerobjetos; um teria sido suficiente.
Jb0bs #

5

Use a Systemclasse para obter a entrada.

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

Como os dados são aceitos no teclado?

Precisamos de três objetos,

  1. System.in
  2. InputStreamReader
  3. BufferedReader

    • InputStreamReader e BufferedReader são classes no pacote java.io.
    • Os dados são recebidos na forma de bytes do teclado pelo System.in, que é um objeto InputStream.
    • Em seguida, o InputStreamReader lê bytes e os decodifica em caracteres.
    • Finalmente, o objeto BufferedReader lê o texto de um fluxo de entrada de caracteres, armazenando em buffer caracteres para fornecer uma leitura eficiente de caracteres, matrizes e linhas.
InputStreamReader inp = new InputStreamReader(system.in);
BufferedReader br = new BufferedReader(inp);

1
System.in(int a primeira linha do código) terá capital Spara o nome da classe.
KNU

5
Entrada do scanner = new Scanner (System.in);
int inteiro = input.nextInt ();
String string = input.next ();
long longInteger = input.nextLong ();

5

Apenas um detalhe extra. Se você não quiser arriscar um vazamento de memória / recursos, feche o fluxo do scanner quando terminar:

myScanner.close();

Observe que o java 1.7 e posterior captura isso como um aviso de compilação (não pergunte como eu sei disso :-)


Mas não se o Scanner estiver aberto para System.in. Você não poderá reabrir o Scanner para System.in novamente em seu programa.
precisa saber é o seguinte

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

Aqui está uma versão mais desenvolvida da resposta aceita, que aborda duas necessidades comuns:

  • Coletando entrada do usuário repetidamente até que um valor de saída seja inserido
  • Lidando com valores de entrada inválidos (não inteiros neste exemplo)

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

Exemplo

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

Observe que nextLine(), sem , a entrada incorreta acionará a mesma exceção repetidamente em um loop infinito. Você pode usar, next()dependendo da circunstância, mas saiba que entradas como this has spacesirão gerar várias exceções.


3

Adicione throws IOExceptionao lado main()e depois

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

3

É muito simples obter entrada em java, tudo o que você precisa fazer é:

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

é a mesma coisa. Você sempre pode apenas inicializar uma matriz com o tipo de dados varName [] OU o tipo de dados [] varName
user2277872 18/13

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

Você pode obter informações do usuário como esta usando um BufferedReader:

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

É assim que você os aplica

    String name = br.readline(); 

Portanto, quando o usuário digitar seu nome no console, "Nome da string" armazenará essas informações.

Se for um número que você deseja armazenar, o código ficará assim:

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

Espero que isso ajude!


2

Pode ser algo assim ...

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 é um código simples que usa a System.in.read()função Este código apenas escreve o que foi digitado. Você pode se livrar do loop while se quiser apenas inserir uma vez e, se quiser, pode armazenar respostas em uma matriz de caracteres.

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

Eu gosto do seguinte:

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

e por exemplo, eu faria:

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

Você pode obter a entrada do usuário usando Scanner. Você pode usar a validação de entrada adequada usando métodos adequados para diferentes tipos de dados, como next()para Stringou nextInt()para 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

A maneira mais simples de obter informações do usuário seria usar o Scanner. Aqui está um exemplo de como deve ser usado:

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

A linha de código import java.util.Scanner; informa ao programa que o programador estará usando entradas do usuário em seu código. Como diz, importa o utilitário do scanner. Scanner sc=new Scanner(System.in);diz ao programa para iniciar as entradas do usuário. Depois de fazer isso, você deve criar uma string ou número inteiro sem um valor e depois colocá-los na linha a=sc.nextInt();ou a=sc.nextLine();. Isso fornece às variáveis ​​o valor das entradas do usuário. Então você pode usá-lo no seu código. Espero que isto ajude.


-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

A sanção por acessar elementos de argssem verificar primeiro o comprimento dessa matriz: voto negativo.
Jub0bs #


-1

A entrada do teclado usando o Scanner é possível, como outras postadas. Porém, nesses tempos altamente gráficos, é inútil fazer uma calculadora sem uma interface gráfica do usuário (GUI).

No Java moderno, isso significa usar uma ferramenta JavaFX de arrastar e soltar, como o Scene Builder, para criar uma GUI semelhante ao console de uma calculadora. Observe que o uso do Scene Builder é intuitivamente fácil e não exige nenhuma habilidade Java adicional para seus manipuladores de eventos do que você já pode ter.

Para entrada do usuário, você deve ter um TextField amplo na parte superior do console da GUI.

É aqui que o usuário insere os números nos quais deseja executar as funções. Abaixo do TextField, você teria uma matriz de botões de função executando funções básicas (por exemplo, adicionar / subtrair / multiplicar / dividir e memória / recuperar / limpar). Depois que a GUI estiver definida, você poderá adicionar as referências 'controller' que vinculam cada função de botão à sua implementação Java, por exemplo, uma chamada ao método na classe controller do seu projeto.

Este vídeo é um pouco antigo, mas ainda mostra como é fácil usar o Scene Builder.


Esta resposta foi rebaixada - sem motivo. Para mim, é a única maneira utilizável de obter a entrada do usuário em um aplicativo Java.
Trunk

Isso é muito útil e não vejo por que foi negado o voto. No entanto, as respostas atuais e a declaração de recompensa sugerem que eles estão procurando uma resposta para futuros usuários que desejam obter informações por meio de um console.
JFreeman 27/01/19

Eu simplesmente não vejo nenhum usuário de Java - exceto aqueles presos com código escrito em versões antigas do Java - tendo algum uso para a entrada do teclado do Scanner. Da última vez, estou respondendo a uma postagem com recompensa. . .
Trunk

Entendo sua queixa completamente. Pessoalmente, acredito que sua resposta é muito útil, portanto não entendo por que ela foi rejeitada. No entanto, em muitas ocasiões tenho programas escritos que não possuem GUI e, portanto, acredito que o código adequado para a Scanneré muito bom para ter disponível.
precisa saber é

Se o OP disser que se trata de um processo de baixo custo (incorporado?) Com E / S mínima ou nenhuma tela, é justo - o scanner é o que eles precisam. Mas eles não declararam isso. O OP nos pediu essencialmente para aceitarmos que esta frase, "entrada do usuário", sugere principalmente a entrada do teclado ou nos convidou a interpretar a frase por nós mesmos. . .
Trunk
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.