Як я можу прочитати вхід з консолі за допомогою класу Scanner на Java?


224

Як я міг прочитати вхід з консолі за допомогою Scannerкласу? Щось на зразок цього:

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

В основному, все, що я хочу, - це сканер прочитати вхід для імені користувача та призначити вхід Stringзмінній.



Відповіді:


341

Простий приклад для ілюстрації того, як java.util.Scannerтвори будуть читати одне ціле число з System.in. Це дійсно досить просто.

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

Щоб отримати ім’я користувача, я, ймовірно, використовував би 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);

Ви також можете використовувати, next(String pattern)якщо хочете більше контролювати вхід, або просто перевірити usernameзмінну.

Більше інформації про їх реалізацію ви знайдете в Документації API дляjava.util.Scanner


1
Скажімо, я використовую сканер лише один раз і не хочу захаращувати свій код, ініціалізуючи тоді закриття сканера - чи є спосіб отримати вхід від користувача, не будуючи клас?
Неару

3
Ви можете використати спробу із заявою про ресурси в JDK 8, наприклад; спробуйте (Scanner Scanner = новий сканер (System.in)) {}
Rune Vikestad


24

Читання даних з консолі

  • BufferedReaderсинхронізовано, тому операції зчитування на BufferedReader можна безпечно робити з декількох потоків. Може бути вказаний розмір буфера або розмір за замовчуванням ( 8192 ). За замовчуванням достатньо великий для більшості цілей.

    readLine () « просто читає дані по рядку з потоку чи джерела. Рядок вважається закінченим будь-яким із цих: \ n, \ r (або) \ r \ n

  • Scannerрозбиває свій вхід до токенів за допомогою шаблону розмежувача, який за замовчуванням відповідає пробілу (s) і розпізнається Character.isWhitespace.

    « Поки користувач не введе дані, операція сканування може заблокувати, чекаючи введення. « Використовуйте сканер ( BUFFER_SIZE = 1024 ), якщо ви хочете проаналізувати певний тип маркера з потоку. « Сканер, однак, не є безпечним для потоків. Це повинно бути зовнішньо синхронізоване.

    next () «Знайде та поверне наступний повний маркер із цього сканера. nextInt () «Переглядає наступний маркер введення як int.

Код

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

Входи та виходи потоку

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

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

Це тепер кращий, більш сучасний варіант відповіді, ніж оригінальний imo.
logicOnAbstractions

Для отримання додаткової інформації див: BufferedReader, Scannerдля читання даних із локального файлу локального файлу (АБО).
Яш

14

Існує проблема із методом input.nextInt () - він зчитує лише значення int.

Отже, читаючи наступний рядок за допомогою input.nextLine (), ви отримуєте "\ n", тобто Enterключ. Отже, щоб пропустити це, ви повинні додати input.nextLine ().

Спробуйте так:

 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

Існує кілька способів отримати інформацію від користувача. Тут у цій програмі ми візьмемо клас Scanner для досягнення поставленого завдання. Цей клас сканера підпадає під java.utilгрупу, тому перший рядок програми - імпорт java.util.Scanner; що дозволяє користувачеві читати значення різних типів на Java. Рядок заяви про імпорт повинен бути в першому рядку програми java, і ми переходимо далі до коду.

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

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

Для доступу до методів класу Сканер створіть новий об’єкт сканера як "в". Зараз ми використовуємо один із його методів, тобто «наступний». Метод "Наступний" отримує рядок тексту, який користувач вводить на клавіатурі.

Тут я використовую, in.nextLine();щоб отримати рядок, який вводить користувач.

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
Чи є якась конкретна причина, чому кожен сканер створюється кожен раз, або це просто копіювати + вставляти, не розуміючи, як це працює?
Євгеній Сергєєв

1
@EvgeniSergeev новий сканер - це об’єкт, який ви створюєте для отримання вводу користувача. читати більше про клас сканерів ...
користувач3598655

напевно копія вставлена. Немає необхідності в новому сканері щоразу (це також не відповідає умовам іменування змінної Java).
гномив

6

Ви можете скласти просту програму, щоб запитати ім'я користувача та друкувати будь-які введення відповіді.

Або попросіть користувача ввести два числа, і ви можете додавати, множувати, віднімати або ділити ці числа та друкувати відповіді на введення користувачів так само, як і поведінка калькулятора.

Тож вам потрібен клас Сканер. Ви повинні import java.util.Scanner;і в коді потрібно використовувати:

Scanner input = new Scanner(System.in);

input - ім'я змінної.

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

Подивіться , як це відрізняється: input.next();, i = input.nextInt();,d = input.nextDouble();

Згідно String, int і double змінюється однаково для решти. Не забудьте заяву про імпорт у верхній частині коду.


2
Це насправді правильне пояснення, але це може бути краще, якщо ви додасте до нього ще кілька методів, як nextLine (), nextLong () .. тощо
subhashis

Студенти повинні наслідувати приклади та перевірити решту методів та самостійно засвоїти те, що я вважаю навчанням із власним досвідом.
користувач3598655

4

Простий приклад:

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

Коли користувач вводить свою / її username, перевіряйте також чинність запису.

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. Щоб прочитати дані:

    Scanner scanner = new Scanner(System.in);
    String input = scanner.nextLine();
  2. Щоб прочитати введення під час виклику методу з деякими аргументами / параметрами:

    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
Ви повинні прочитати цю довідкову сторінку щодо форматування тексту / коду: stackoverflow.com/help/formatting .
Том

Ви можете перекласти його (з французької?).
Пітер Мортенсен

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

Ось повний клас, який виконує необхідну операцію:

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
Немає підстав використовувати кілька примірників Scanner.
Radiodef

1

Ви можете передавати цей код:

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

1
Це не дає нової інформації та є навіть менш корисною, ніж існуючі відповіді через відсутні пояснення.
Том

1
Що ви маєте на увазі під "потоком цього коду" ? Ви маєте на увазі "дотримуйтесь цього коду" ? Або щось інше?
Пітер Мортенсен


0

Існує простий спосіб читання з консолі.

Знайдіть код нижче:

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

Для детального розуміння, будь ласка, зверніться до поданих нижче документів.

Док

Тепер поговоримо про детальне розуміння роботи класу Scanner:

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

Це конструктор для створення екземпляра Scanner.

Тут ми передаємо InputStreamпосилання, яке є не що інше, як System.In. Тут він відкриває InputStreamТрубу для введення консолі.

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

При передачі System.in цей код відкриє сокет для читання з консолі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.