Como posso ler as entradas do console usando a classe Scanner em Java?

224

Como eu pude ler as entradas do console usando a Scannerclasse? Algo assim:

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

Basicamente, tudo que eu quero é que o scanner leia uma entrada para o nome de usuário e atribua a entrada a uma Stringvariável.

Hock3yPlayer
fonte

Respostas:

341

Um exemplo simples para ilustrar como java.util.Scannerfunciona a leitura de um único número inteiro System.in. É realmente bem simples.

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

Para recuperar um nome de usuário, eu provavelmente usaria 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);

Você também pode usar next(String pattern)se quiser mais controle sobre a entrada ou apenas validar a usernamevariável.

Você encontrará mais informações sobre sua implementação na documentação da API parajava.util.Scanner

Rune Vikestad
fonte
1
Digamos que eu só uso o scanner uma vez e não quero bagunçar meu código, inicializando e fechando o Scanner - existe uma maneira de obter informações do usuário sem criar uma classe?
Nearoo 13/10
3
Você pode usar uma tentativa com instrução de recurso no JDK 8, como; try (Scanner scanner = novo scanner (System.in)) {}
Rune Vikestad 15/10
33
Scanner scan = new Scanner(System.in);
String myLine = scan.nextLine();
Matt_Bro
fonte
24

Lendo dados do console

  • BufferedReaderestá sincronizado, portanto, operações de leitura em um BufferedReader podem ser realizadas com segurança a partir de vários threads. O tamanho do buffer pode ser especificado ou o tamanho padrão ( 8192 ) pode ser usado. O padrão é grande o suficiente para a maioria dos propósitos.

    readLine () « apenas lê dados linha por linha do fluxo ou fonte. Uma linha é considerada terminada por qualquer um destes: \ n, \ r (ou) \ r \ n

  • Scannerdivide sua entrada em tokens usando um padrão delimitador, que por padrão corresponde a espaços em branco (\ s) e é reconhecido por Character.isWhitespace.

    « Até que o usuário insira dados, a operação de digitalização poderá bloquear, aguardando a entrada. « Use o Scanner ( BUFFER_SIZE = 1024 ) se desejar analisar um tipo específico de token de um fluxo. « No entanto, um scanner não é seguro para threads. Tem que ser externamente sincronizado.

    next () «Localiza e retorna o próximo token completo deste scanner. nextInt () «Verifica o próximo token da entrada como um 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 e saídas de Stream

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

Scanner Input:    Output:
Yash 777          token1 = Yash
                  token2 = 777
Yash
fonte
Agora, essa é uma resposta melhor e mais atualizada do que a imo original.
logicOnAbstractions
Para obter mais informações, consulte: BufferedReader, Scannerpara ler dados de um arquivo de rede de arquivo local (OR).
Yash
14

Há um problema com o método input.nextInt () - ele lê apenas o valor int.

Portanto, ao ler a próxima linha usando input.nextLine (), você recebe "\ n", ou seja, a Enterchave. Então, para pular isso, você deve adicionar o input.nextLine ().

Tente assim:

 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();
Vaibhav Bhalla
fonte
10

Existem várias maneiras de obter informações do usuário. Aqui neste programa, levaremos a classe Scanner para realizar a tarefa. Essa classe de scanner é incluída java.util, portanto a primeira linha do programa é import java.util.Scanner; que permite ao usuário ler valores de vários tipos em Java. A linha da instrução de importação deve estar na primeira linha do programa java e prosseguimos para o código.

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

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

Para acessar métodos na classe Scanner, crie um novo objeto de scanner como "in". Agora usamos um de seus métodos, que é "próximo". O método "next" obtém a sequência de texto que um usuário digita no teclado.

Aqui estou usando in.nextLine();para obter a String que o usuário digita.

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);
    }
}
Jaimin Patel
fonte
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);
    }
}
Radiodef
fonte
5
Existe alguma razão específica para a criação de um novo scanner toda vez ou isso é apenas copiar e colar sem entender como funciona?
Evgeni Sergeev
1
O novo Scanner @EvgeniSergeev é o objeto que você cria para obter a entrada do usuário. leia mais sobre a classe Scanner ...
user3598655
definitivamente copiar colado. Não há necessidade de um novo scanner sempre (isso também não segue a convenção de nomenclatura de variáveis ​​java).
Gnomed
6

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

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, você precisa da classe Scanner. Você precisa import java.util.Scanner;e no código você precisa usar:

Scanner input = new Scanner(System.in);

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

user3598655
fonte
2
Esta é realmente uma explicação adequada, mas poderia ser mais melhor se você adicionar mais alguns métodos a ele como nextLine (), nextLong () .. etc
subhashis
Os alunos devem seguir os exemplos e testar o restante dos métodos e aprender por eles mesmos que é isso que eu acredito que seja aprender com a própria experiência.
user3598655
4

Um exemplo simples:

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);
    }
}
Clark
fonte
3

Quando o usuário entrar username, verifique também se há entradas válidas.

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);
Anirban Nag 'tintinmj'
fonte
2
  1. Para ler a entrada:

    Scanner scanner = new Scanner(System.in);
    String input = scanner.nextLine();
  2. Para ler a entrada quando você chama um método com alguns 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());
    }
MyUserQuestion
fonte
1
Você deve ler esta página de ajuda sobre como formatar seu texto / código: stackoverflow.com/help/formatting .
Tom
Você pode querer traduzi-lo (do 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();
    }
}
tomar sol
fonte
2

Aqui está a classe completa que executa a operação necessária:

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);
    }
}
Prasenjit Chatterjee
fonte
1
Não há razão para usar várias instâncias de Scanner.
Radiodef 5/04
1

Você pode fluir este código:

Scanner obj= new Scanner(System.in);
String s = obj.nextLine();
Tarik Billa
fonte
1
Isso não fornece novas informações e é ainda menos útil que as respostas existentes devido à falta de explicações.
Tom
1
O que você quer dizer com "fluir esse código" ? Você quer dizer "siga este código" ? Ou alguma outra coisa?
Peter Mortensen
0

Você pode usar a classe Scanner em Java

Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
System.out.println("String: " + s);
Yasir Shabbir Choudhary
fonte
0

Existe uma maneira simples de ler no console.

Encontre o código abaixo:

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 um entendimento detalhado, consulte os documentos abaixo.

Doc

Agora vamos falar sobre o entendimento detalhado do funcionamento da classe Scanner:

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

Este é o construtor para criar a instância do Scanner.

Aqui estamos passando a InputStreamreferência que nada mais é que a System.In. Aqui ele abre o InputStreamPipe para entrada do 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);
    }
}

Ao passar o System.in, esse código abrirá o soquete para leitura no console.

Hasnain Ali Bohra
fonte