что такое scanner в java
Класс Scanner в Java: Описание, методы, примеры
Scanner это класс в языке Java, который позволяет считывать данные из разных источников. В том числе и с консоли. Сегодня я хочу описать принципы его работы и показать на примере как можно прочитать ввод юзера в Java программу.
Класс сканер был создан для чтения данных из входящих потоков. Это может быть консоль приложения, файл и т.д.
Давайте теперь посмотрим, как его можно использовать чтобы считать пользовательский ввод с консоли и подать данные в программу.
Допустим у нас есть приложение при котором юзеру сначала нужно ввести цифры, а потом текст. Вот что получилось у меня:
В результате запуска приложения:
Как видите, код довольно простой. Чтобы вызвать методы класса Scanner нужно всего лишь написать Scanner scanner = new Scanner(System.in);
Внутри скобок (System.in); я передал систем ин так как хочу чтобы мой сканер считывал данные из консоли.
Чтобы считать данные из файла достаточно передать в скобки new File(“путь_к_файлу”).
В корне проекта я создал текстовый файл test.txt с содержимым:
Вот моя программа, которая считывает строку из файла с помощью класса Scanner:
Если нужно считать из файла больше чем одну строку, то тут уже не обойтись без циклов. Если Вы еще не знакомы с этим понятием — эту часть статьи можно пропустить и приступить к ней после изучения циклов.
В класс Scanner есть метод hasNextLine(), который возвращает true/false в зависимости от того есть ли еще строки в файле. Используя этот метод и цикл можно считать весь файл строка за строкой:
Мой исходный текстовый файл:
А вот результат работы приложения:
Причем программу выше можно немного оптимизировать и добавлять прочитанные строки к одной строке а потом можно вывести все целиком. Или можно как-то обработать строку в дальнейшем.
Это все что я хотел рассказать о классе Scanner. Он станет для Вас удобным инструментом для считывания данных с консоли или файла чтобы писать базовые интерактивные приложения на языке Java.
Я намеренно не стал рассказывать об остальных методах сканера, так как думаю что для новичков этого будет достаточно. Все остальное сможете посмотреть при непосредственном использовании Scanner.
Работа со сканером в Java (ввод и вывод данных)
Предлагаем вспомнить 2 примера из жизни, которые как нельзя кстати будут для изучения данной темы.
Чем то схожие задачи есть и в мире программирования на Java. Например, часто необходимо выполнить такие задачи:
Итак, рассмотрим несколько примеров кода, после которых Вы:
Ввод с клавиатуры
1. Чтение с консоли, System.in
Но, как вы уже наверное догадываетесь, одного вывода на экран недостаточно. Цель большинства программ — сделать что-то полезное для пользователя. Поэтому очень часто нужно, чтобы пользователь мог вводить данные с клавиатуры.
Поэтому мы воспользуемся еще одним классом, который в паре с объектом System.in даст нам все, что нужно. В Java уже давно есть классы на все случаи жизни. С одним из них мы сейчас и познакомимся.
2. Класс Scanner
Класс Scanner (полное имя java.util.Scanner ) умеет считывать данные из разных источников: консоль, файлы, интернет. Если мы хотим, чтобы он считывал данные с клавиатуры, мы должны передать ему объект System.in в качестве параметра – источника данных. А уж объект типа Scanner сам разберется, что с ним делать.
Считывание с клавиатуры с помощью объекта типа Scanner будет выглядеть примерно так:
Выглядит вроде несложно, но так ли все просто на самом деле?
Думаю, у вас появилась куча вопросов, и сейчас мы на них ответим.
Но для начала продемонстрируем пример полной программы, где используется класс Scanner :
3. Создание объекта Scanner
Такая строка может сбивать с толку, однако вы будете постоянно встречать похожие вещи. Так что, думаем, настало время объяснить, что тут написано.
Вспомним, как мы обычно создаем переменную с текстом:
Сначала мы пишем тип переменной ( String ), затем ее имя ( str ) и, наконец, после знака равно пишем значение.
В нашей странной строке на самом деле все то же самое:
Думаю, теперь все стало гораздо понятнее.
4. Вызов методов
Чтобы вызвать методы объекта, на который ссылается переменная, нужно после имени переменной написать точку, а затем имя метода и параметры. Общий вид этой команды такой:
Если вы не планируете передавать в функцию параметры, нужно писать просто пустые скобки:
5. Ввод данных с консоли
Если пользователь ввел данные, которые невозможно преобразовать в целое число, в программе возникнет ошибка, и она завершится.
Пример программы, которая считывает с клавиатуры два числа и выводит их сумму:
6. Другие методы класса Scanner
Метод | Описание |
---|---|
Считывает данные и преобразует их в тип byte | |
Считывает данные и преобразует их в тип short | |
Считывает данные и преобразует их в тип int | |
Считывает данные и преобразует их в тип long | |
Считывает данные и преобразует их в тип float | |
Считывает данные и преобразует их в тип double | |
Считывает данные и преобразует их в тип boolean | |
Считывает одно «слово». Слова разделяются пробелами или enter | |
Считывает целую строку |
Есть еще методы, которые позволяют проверить тип еще не считанных данных (чтобы знать, каким методом их считывать).
7. Ввод данных из строки
Как работать с классом Scanner в Java: примеры
С помощью класса java.util.Scanner можно анализировать простые типы данных и строки. Этот класс принимает данные из файлов, потоков, строк, последовательностей символов или байтов.
Входные данные разбиваются на токены. По умолчанию разделителем токенов служит пробел, но его можно заменить строкой ( java.lang.String ) или регулярным выражением ( java.util.regex.Pattern ).
Давайте рассмотрим конструкторы этого класса по порядку.
Конструктор public Scanner(Readable source)
Вот как это делается с помощью класса FileReader :
Конструктор public Scanner(InputStream source)
Этот конструктор создает сканер, с помощью которого можно получить значения из указанного входного потока. Байты из такого потока преобразуются в символы (с использованием набора символов по умолчанию для базовой платформы).
Также есть вариант конструктора, который позволяет получать значения из входного потока, преобразовывая байты в символы с использованием набора символов, указанного пользователем:
public Scanner(InputStream source, String charsetName)
Например, для потока стандартного ввода он объявляется просто:
Scanner scanner = new Scanner(System.in)
Конструктор public Scanner(File source) throws FileNotFoundException
Чтобы использовать произвольный набор символов, укажите его во втором аргументе:
public Scanner(File source, String charsetName) throws FileNotFoundException
Scanner scanner = new Scanner(new File(«D:\Scanner.txt»));
Конструктор public Scanner(Path source) throws IOException
Для использования другого набора символов укажите его во втором аргументе:
public Scanner(Path source, String charsetName) throws IOException
Давайте создадим сканер с помощью пути:
Конструктор public Scanner(String source)
Создает сканер, который позволяет получать значения из указанной строки:
Scanner scanner = new Scanner(«Parse me»);
Как прочитать файл с помощью класса Scanner
Как прочитать ввод из консоли с помощью класса Scanner
Чтобы прочитать данные из консоли, создадим входной поток System.in и используем метод nextLine() :
Методы класса Scanner
Тип возврата | Метод | Описание |
void | close() | Закрывает объект сканера. |
Pattern | delimiter() | Возвращает шаблон, который объект Scanner в настоящее время использует для сопоставления разделителей. |
String | findlnLine(Pattern pattern) | Этот метод возвращает объект String, который удовлетворяет объекту Pattern, указанному в качестве аргумента метода. |
String | findlnLine(String pattern) | Пытается найти следующее вхождение шаблона, созданного из указанной строки, игнорируя разделители. |
String | findWithinHorizon(Pattern pattern, int horizon) | Ищет следующее вхождение указанного шаблона. |
String | findWithinHorizon(String pattern, int horizon) | Ищет следующее вхождение шаблона ввода, игнорируя разделитель |
boolean | hasNext() | Возвращает true, если у этого сканера есть другой токен на входе. |
boolean | hasNext(Pattern pattern) | Возвращает true, если следующий полный токен соответствует указанному шаблону. |
boolean | hasNext(String pattern) | Возвращает true, если следующий токен соответствует шаблону, созданному из указанной строки. |
boolean | hasNextBig Decimal() | Возвращает true, если следующий токен на входе этого сканера можно интерпретировать как BigDecimal с помощью метода nextBigDecimal(). |
Подробнее о сканере можно прочитать на сайте документации по Java.
Вводный курс. Язык программирования Java
9. Ввод данных. Класс Scanner
Класс Scanner используется для считывания введенных пользователем данных следующих типов: String, byte, short, int, long, float, double.
«Университетский центр Турбо»
содержит три токена:
Вернемся к сканеру. Сканер выполняет поиск токенов во входной строке. Для работы со сканером необходимо создать объект класса Scanner, указав с какими потоками ввода/вывода он будет связан:
Пример. Создаем объект класса Scanner и связываем его с клавиатурой для ввода данных с клавиатуры:
Scanner scan = new Scanner(System.in);
Класс Scanner имеет следующие основные методы:
Если считываемый тип данных не соответствует используемому типу метода сканера, то возникнет ошибка времени выполнения программы, например, читаем целое число, а пользователь вводит дробное. Для того чтобы избежать подобных ошибок используются методы проверки считываемых типов:
Пример. Чтение целого числа
Пример. Чтение вещественного числа
По умолчанию дробное число вводится через запятую. Если требуется вводить число через точку, необходимо установить локаль:
Пример. Чтение последовательности целых чисел
При вводе числа отделяются между собой нажатием клавиши «Enter» или пробелом. Ввод прервется, если будет введено не целое число.
Пример. Ввод строки
Пример. Обработка строки, заданной в коде программы
Пример. Чтение файла
При использовании кириллицы файл должен иметь кодировку UTF-8.