Как организовать ввод данных с консоли в Java?

«Как организовать ввод данных с консоли в Java?» — вопрос из категории Other, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Java для чтения ввода с консоли (стандартного потока ввода System.in) чаще всего используются классы Scanner и BufferedReader.

1. Использование Scanner (наиболее простой способ для начинающих)

Scanner предоставляет удобные методы для разбора примитивных типов и строк.

import java.util.Scanner;

public class ConsoleInputExample {
    public static void main(String[] args) {
        // Создание Scanner, связанного с System.in
        Scanner scanner = new Scanner(System.in);

        System.out.print("Введите ваше имя: ");
        String name = scanner.nextLine(); // Чтение всей строки

        System.out.print("Введите ваш возраст: ");
        int age = scanner.nextInt(); // Чтение целого числа

        System.out.printf("Привет, %s! Тебе %d лет.%n", name, age);

        scanner.close(); // Важно закрыть ресурс
    }
}

Важно: Используйте try-with-resources для гарантированного закрытия ресурса:

try (Scanner scanner = new Scanner(System.in)) {
    System.out.print("Введите число: ");
    int num = scanner.nextInt();
    System.out.println("Вы ввели: " + num);
} // Scanner закроется автоматически

2. Использование BufferedReader (более производительный способ для чтения строк)

BufferedReader читает данные блоками, что эффективнее для большого объема ввода.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BufferedReaderExample {
    public static void main(String[] args) throws IOException {
        // Обёртываем System.in в InputStreamReader, затем в BufferedReader
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        System.out.print("Введите текст: ");
        String inputLine = reader.readLine(); // Чтение строки
        System.out.println("Вы ввели: " + inputLine);

        reader.close();
    }
}

Ключевые различия и выбор:

  • Scanner удобен для разбора ввода по типам (nextInt(), nextDouble()), но может быть медленнее и имеет нюансы с nextLine() после nextInt() (остаётся символ новой строки).
  • BufferedReader быстрее при чтении больших текстовых данных, но работает только со строками, требуя последующего парсинга (например, Integer.parseInt(reader.readLine())).
  • System.console() — ещё один вариант, предоставляющий методы readLine() и readPassword() (для скрытия ввода пароля), но он может возвращать null в некоторых средах (например, при запуске в IDE).