Класс Scanner в Java — обзор с примерами использования

business

Основная задача класса Scanner в Java состоит в том, чтобы сканировать полученные данные. Источники этих данных могут быть самые разнообразные, файлы, ввод с консоли или даже строки.

Базовый функционал класса легко умеет отделять такие примитивные типы как byte, short, float, String и другие.

Сканирование происходит при помощи поиска разделителя или так называемоего токена. Также в дело могут быть применены регулярные выражение, для которых в классе Scanner существуют определенные методы.

Токен может быть представлен любым из символом: пробел, табуляция или любым другим символом. Также и разделитель строк зачастую представлен символом перевода строки “Enter”.

Обзор основного функционала класса Scanner в Java

Как и было описано ранее, класс scanner содержит множество методов для работы с примитивными типами. Также существуют дополнительно служебные методы проверки наличия данных, например:

hasNextLine() — проверяет если в наличии новая строка для считывания.

hasNextInt() — проверка есть ли в наличии новое  целое число для считывания.

При ошибках чтения данных могут возникать следующие исключения:

InputMismatchException — несоотвествие типов входящих данных. Часто возникает из-за ошибочно выбранной локализации.

IllegalStateException — возникает при ошибочном чтении с помощью регулярных выражений.

Пример использования в Java Scanner класса

В данном примере мы рассмотрели три варианта входящих данных: консольные данные, данные из файла, данные из строки.

  • Где в консоли мы принимали разные типы данных. В конце  в результате мы сделали вывод данных для наглядного отображения.
  • В примере с файлом мы использовали две строки для того, чтобы отобразить возможность работать с текстом построчно.
  • Также мы привели пример работы сканера со строками. В результате строка была преобразована в новый формат с разделителем -.
  • Самым последним добавлен пример работы с регулярными выражениями.

Коментарии к коду специально объяснют функционал и результирующие данные. См. в блоке код.

class TestScanner {
    public static void main(String[] args) {

        systemInScan(); // Scan system inpu
        fileScan(); // Scan file input
        stringScan(); // Scan string

        regexScan();
    }


    private static void systemInScan() {

        Scanner systemInScanner = new Scanner(System.in);

        int integerValue = systemInScanner.nextInt();
        long longValue = systemInScanner.nextLong();
        float floatValue = systemInScanner.nextFloat();
        double doubleVar = systemInScanner.nextDouble();

        String stringValue = systemInScanner.next();
        systemInScanner.close();

        System.out.println("Example of test input:");

        System.out.println("integerValue:" + integerValue);
        System.out.println("longValue:" + longValue);
        System.out.println("floatValue:" + floatValue);
        System.out.println("doubleVar:" + doubleVar);
        System.out.println("stringValue:" + stringValue);

        /*
            1
            2
            3.3
            4.4
            Test

            Example of test input:
            integerValue:1
            longValue:2
            floatValue:3.3
            doubleVar:4.4
            stringValue:Test
        */
    }


    private static void fileScan() {

        /* file content: test.txt

            Пример первой строки
            Пример второй строки
        */

        try {
            Scanner fileScanner = new Scanner(new FileReader("test.txt"));

            while (fileScanner.hasNextLine()) {
                String line = fileScanner.nextLine();

                System.out.println(line);
            }
            fileScanner.close();

            /* Output:

               Пример первой строки
               Пример второй строки
            */

        } catch (FileNotFoundException e) {
            System.out.println("File not found");
        }
    }


    private static void stringScan() {

        Scanner stringScanner = new Scanner("1 2 3 4 5 6 7 8");

        StringBuilder sb = new StringBuilder();
        while (stringScanner.hasNext()) {

            sb.append(stringScanner.nextInt());
            sb.append("-");
        }

        stringScanner.close();

        System.out.println(sb.toString());

        /* Output:

           1-2-3-4-5-6-7-8-
        */
    }

    private static void regexScan() {
        String s = "white cat smoky cat red cat black cat";
        Scanner scanner = new Scanner(s);
        scanner.findInLine("(\\w+) cat (\\w+) cat (\\w+) cat (\\w+)");
        MatchResult match = scanner.match();

        for (int i = 1; i <= match.groupCount(); i++)
            System.out.println(match.group(i));

        /* Output:

            white
            smoky
            red
            black
        */

        scanner.close();
    }
}

Пример работы сканера с регулярными выражениями

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

В данном примере мы находим всех котов, которые присутствуют в строке.

String s = "white cat smoky cat red cat black cat";
Scanner scanner = new Scanner(s);
scanner.findInLine("(\\w+) cat (\\w+) cat (\\w+) cat (\\w+)");
MatchResult match = scanner.match();

for (int i = 1; i <= match.groupCount(); i++)
    System.out.println(match.group(i));

/* Output:

    white
    smoky
    red
    black
*/

 scanner.close();

С помощью класса Scanner очень легко можно обрабатывать/сканировать разнообразные типы данных. Буквально несколько строк кода могут автоматизировать целый процесс извлеченния данных из разных источников.

Related posts

Leave a Comment