Избранное сообщение

Фетісов В. С. Комп’ютерні технології в тестуванні. Навчально-методичний посібник. 2-ге видання, перероблене та доповнене / Мои публикации

В 10-х годах я принимал участие в программе Европейского Союза Tempus "Освітні вимірювання, адаптовані до стандартів ЄС". В рамк...

Благодаря Интернету количество писателей и поэтов увеличивается в геометрической прогрессии. Поголовье читателей начинает заметно отставать.

пятница, 27 января 2017 г.

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

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

Краткий обзор класса Scanner в Java

Класс Scanner используется для получения (считывания) данных введенных пользователем в виде Stringbyteshortintlongfloatdouble.
Сканер выполняет поиск токенов во входной строке.
Токен (или маркер) представляет собой серию цифровых или буквенно-цифровых символов, которая заканчивается разделителем. Разделителем может быть символ табуляции, возврат каретки (перевод строки или же просто ‘Enter’), конец файла или пробел.
Пример: если пользователем был введен ряд чисел с пробелами между каждым номером, то класс Scanner будет принимать все номера в качестве отдельного токена. В этом случае пробельные символы выступают в качестве разделителей.

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

Класс Scanner предоставляется с множеством конструкторов, например:

Scanner scanner = new Scanner(System.in); // получаем InputStream
Scanner fileScanner = new Scanner(new FileReader("передаем сюда имя файла"));
Scanner stringScanner = new Scanner("здесь строка"); // получаем сканер со строки
...
Второй конструктор бросает FileNotFoundException.
Давайте рассмотрим академические примеры работы с каждым из них:
1). Считываем примитивные типы данных и строку:

Scanner scanner = new Scanner(System.in);
int integerVar = scanner.nextInt(); // 22
long longVar = scanner.nextLong(); // 1000000
float realVar = scanner.nextFloat(); // 1,23
double doubleVar = scanner.nextDouble(); // 1,254
String string = scanner.next(); // test

Обратите внимание, что при считывании float и double может быть выброшен InputMismatchException. Это говорит о том, что было введено значение, которое не распозналось как float или double.
Почему так происходит? Все дело в локали, а еще точнее — в знаке, который отделяет целую часть от остатка. В нашем случае мы вводили значение с запятой: 1,23 и проблем не было, однако попытка ввода такого значения: 1.23 приведет к вышеупомянутой ошибке.
Как избежать этого? Достаточно просто указать для Scanner‘а локаль:

Scanner scanner = new Scanner(System.in);
scanner.useLocale(Locale.US);
И теперь можно считывать float и double значения с точкой в виде 1.231.
Также ситуации с InputMismatchException можно избежать используя методы:
  • boolean hasNextLine(): вернет true если у сканера есть следующая входная строка, иначе — false;
  • boolean hasNextInt(): вернет true если следующим токеном сканера является значение типа int;
  • boolean hasNextFloat(): вернет true если следующим токеном сканера является значение типа float;
2). Вторым академическим примером является обработка файла с помощью Scanner
Он располагает двумя методами для считывания данных:
  • .hasNext();
  • .hasNextLine();
Они возвращают true, если в файле есть еще токен.

public static void main(String[] args) {
        File file = new File("test.txt");
        try {
            Scanner scanner = new Scanner(file);
            // обрабатываем файл пока в нем еще есть токен
            // в данном случае - есть ли новая строка
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                // печатаем построчно
                System.out.println(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

Как видите, классом Scanner очень удобно обрабатывать различные источники информации — будь-то файлы, потоки ввода или строки.

Комментариев нет:

Отправить комментарий