Базовое использование
Класс Scanner из пакета java.util читает данные из консоли, файлов и строк.
import java.util.Scanner;public class Greeting { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Введите имя: "); String name = scanner.nextLine(); System.out.print("Введите возраст: "); int age = scanner.nextInt(); System.out.println("Привет, " + name + "! Через год вам будет " + (age + 1)); scanner.close(); }}System.in — стандартный поток ввода.
Методы чтения
| Метод | Что читает |
|---|---|
nextLine() | строку целиком до перевода строки |
next() | одно слово до пробела |
nextInt() | целое |
nextLong() | длинное целое |
nextDouble() | дробное |
nextBoolean() | true или false |
Проблема nextLine после nextInt
nextInt() не забирает символ перевода строки, поэтому следующий nextLine() вернет пустую строку.
import java.util.Scanner;public class NextLineTrap { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Возраст: "); int age = scanner.nextInt(); scanner.nextLine(); System.out.print("Имя: "); String name = scanner.nextLine(); System.out.println(name + ", " + age); }}Лишний вызов scanner.nextLine() после числа очищает остаток строки. Надежнее читать всегда строкой и преобразовывать:
int age = Integer.parseInt(scanner.nextLine().trim());Проверка ввода
Методы hasNextInt(), hasNextDouble() и аналоги проверяют, что дальше в потоке:
import java.util.Scanner;public class SafeInput { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int number; while (true) { System.out.print("Введите целое число: "); if (scanner.hasNextInt()) { number = scanner.nextInt(); break; } System.out.println("Это не число, попробуйте еще раз."); scanner.next(); } System.out.println("Вы ввели: " + number); }}Несколько чисел в одной строке
import java.util.Scanner;public class SumLine { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Введите три числа через пробел: "); int a = scanner.nextInt(); int b = scanner.nextInt(); int c = scanner.nextInt(); System.out.println("Сумма: " + (a + b + c)); }}Чтение до конца ввода
import java.util.Scanner;public class ReadAll { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int total = 0; while (scanner.hasNextInt()) { total += scanner.nextInt(); } System.out.println("Итого: " + total); }}Конец ввода в консоли: Ctrl+D в Linux и macOS, Ctrl+Z затем Enter в Windows.
Scanner для строки
import java.util.Scanner;public class ParseString { public static void main(String[] args) { Scanner scanner = new Scanner("10 20 30"); int sum = 0; while (scanner.hasNextInt()) { sum += scanner.nextInt(); } System.out.println(sum); }}Закрытие Scanner
Если Scanner читает System.in, закрывать его нужно один раз в конце программы: закрытие закрывает и сам поток. Для файлов используйте try-with-resources, о нем в главе про исключения.
BufferedReader
Для больших объемов данных быстрее BufferedReader:
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class FastInput { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String line = reader.readLine(); int number = Integer.parseInt(line.trim()); System.out.println(number * 2); }}BufferedReader читает только строки, преобразование типов выполняется вручную.
