Scanner

Класс java.util.Scanner предназначен для чтения и разбора (парсинга) текстовых данных. Чаще всего он используется для ввода с клавиатуры через System.in, но также умеет читать из строки, файла или потока.

Scanner разбивает входной поток на токены (слова), используя разделители (по умолчанию — пробелы, табы и переводы строк). Для каждого типа данных у него есть свой метод: nextInt() читает целое число, nextDouble() — дробное, next() — слово, nextLine() — всю строку до перевода строки.

Важная деталь: после nextInt() в буфере остаётся непрочитанный перевод строки. Если сразу за ним вызвать nextLine(), он вернёт пустую строку. Поэтому часто перед чтением строки добавляют «пустой» nextLine().

После работы Scanner желательно закрывать через close().

Зачем нужен

  • получать данные от пользователя в консольных программах;

  • разбирать числа и строки из текста;

  • читать данные из файла построчно;

  • быстро прототипировать алгоритмы с пользовательским вводом.

Способы создания

import java.util.Scanner;

Scanner sc1 = new Scanner(System.in);        // с клавиатуры
Scanner sc2 = new Scanner("123 456 789");    // из строки
// Scanner sc3 = new Scanner(new File("data.txt")); // из файла (throws IOException)

Популярные методы

Метод

Назначение

nextInt()

читать целое число

nextLong()

читать длинное целое

nextDouble()

читать дробное число

next()

читать слово (до пробела)

nextLine()

читать строку до перевода строки

nextBoolean()

читать true/false

hasNext()

есть ли ещё токен

hasNextInt()

является ли следующий токен числом

hasNextLine()

есть ли ещё строка

useDelimiter(String)

задать свой разделитель

close()

закрыть Scanner

Предупреждение

В русскоязычной локали nextDouble() по умолчанию ждёт запятую как разделитель (3,14). Для точки используйте sc.useLocale(java.util.Locale.US) или вводите число с запятой.

Примеры

Пример 1. Чтение имени

import java.util.Scanner;

public class Demo1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Как тебя зовут? ");
        String name = sc.nextLine();
        System.out.println("Привет, " + name + "!");
        sc.close();
    }
}

Ввод и вывод:

Как тебя зовут? Беку
Привет, Беку!

Пример 2. Сумма двух чисел

import java.util.Scanner;

public class Demo2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("a = ");
        int a = sc.nextInt();
        System.out.print("b = ");
        int b = sc.nextInt();
        System.out.println("Сумма = " + (a + b));
        sc.close();
    }
}

Ввод и вывод:

a = 7
b = 5
Сумма = 12

Пример 3. Чтение из строки

import java.util.Scanner;

public class Demo3 {
    public static void main(String[] args) {
        Scanner sc = new Scanner("10 20 30 40");
        int sum = 0;
        while (sc.hasNextInt()) {
            sum += sc.nextInt();
        }
        System.out.println("Сумма: " + sum);
        sc.close();
    }
}

Вывод:

Сумма: 100

Пример 4. Проверка числа перед чтением

import java.util.Scanner;

public class Demo4 {
    public static void main(String[] args) {
        Scanner sc = new Scanner("42 hello 17");
        while (sc.hasNext()) {
            if (sc.hasNextInt()) {
                System.out.println("Число: " + sc.nextInt());
            } else {
                System.out.println("Слово: " + sc.next());
            }
        }
        sc.close();
    }
}

Вывод:

Число: 42
Слово: hello
Число: 17

Пример 5. Ловушка nextInt + nextLine

import java.util.Scanner;

public class Demo5 {
    public static void main(String[] args) {
        Scanner sc = new Scanner("25\nАйдар\n");
        int age = sc.nextInt();
        sc.nextLine();              // съесть остаток строки
        String name = sc.nextLine();
        System.out.println("Имя: " + name + ", возраст: " + age);
        sc.close();
    }
}

Вывод:

Имя: Айдар, возраст: 25

Пример 6. Чтение чисел через свой разделитель

import java.util.Scanner;

public class Demo6 {
    public static void main(String[] args) {
        Scanner sc = new Scanner("1,2,3,4,5");
        sc.useDelimiter(",");
        int product = 1;
        while (sc.hasNextInt()) {
            product *= sc.nextInt();
        }
        System.out.println("Произведение: " + product);
        sc.close();
    }
}

Вывод:

Произведение: 120

Пример 7. Поиск максимума

import java.util.Scanner;

public class Demo7 {
    public static void main(String[] args) {
        Scanner sc = new Scanner("5 -3 18 7 11 -42 24");
        int max = Integer.MIN_VALUE;
        while (sc.hasNextInt()) {
            int x = sc.nextInt();
            if (x > max) max = x;
        }
        System.out.println("Максимум: " + max);
        sc.close();
    }
}

Вывод:

Максимум: 24

Пример 8. Чтение по строкам

import java.util.Scanner;

public class Demo8 {
    public static void main(String[] args) {
        String data = "первая строка\nвторая строка\nтретья строка";
        Scanner sc = new Scanner(data);
        int n = 0;
        while (sc.hasNextLine()) {
            n++;
            System.out.println(n + ": " + sc.nextLine());
        }
        sc.close();
    }
}

Вывод:

1: первая строка
2: вторая строка
3: третья строка

См. также

Примечание

Лицензия и источники

Техническое описание класса адаптировано из официальной Java API Documentation (https://docs.oracle.com/en/java/javase/), Oracle Free Documentation License. Перевод на русский, примеры и пояснения — © AlashEd Wiki.