Класс Scanner
Класс Scanner упрощает разбор строки из потока ввода, позволяя обойтись без классов BufferedReader, InputStreamReader. В качестве входных объектов можно использовать File, InputStream, String, Readable. В учебных примерах часто используют System.in в качестве приёма данных от настольной клавиатуры, что не слишком актуально для Android.
Метод next() возвращает следующую лексему String, также существуют методы для примитивных типов, например, nextInt(). Метод выполняется в блокирующем режиме. Также существуют соответствующие методы hasNext(), которые возвращают true, если следующая лексема относится к правильному типу.
По умолчанию входные данные разбиваются по пробелам между словами. Можно задать собственный разделитель в форме регулярного выражения в методе useDelimiter().
Простейший пример разбивки предложения на отдельные слова.
Scanner scanner = new Scanner("Кот Васька 28 Москва"); while (scanner.hasNext()) < System.out.println(scanner.next()); >// Ответ I/System.out: Кот I/System.out: Васька I/System.out: 28 I/System.out: Москва
Scanner scanner = new Scanner("27"); System.out.println(scanner.nextInt()); // 27
Класс Scanner.
Считывание чисел
с клавиатуры
В этой теме мы научимся считывать в программу числа, которые пользователь вводит с клавиатуры. Мы сможем попросить пользователя ввести любые данные, а потом правильно на них отреагировать. В будущем совершенно аналогично чтению с клавиатуры класс Scanner можно будет использовать, чтобы читать текст из файлов и из каналов интернет-связи.
Когда вы записали в переменную число, вы можете делать с ним всё что угодно. Это мог быть ответ человека на вопрос теста типа «Сколько будет 7*7?» Это мог быть ответ на вопрос типа «Выберите первое, второе или третье действие», и программа выполнит выбранное действие. Это могли быть входящие данные типа «Введите значение скорости поезда и длину пути, и программа ответит вам, когда он прибудет в такой-то город». Это бывает нужно постоянно – программы считывают данные от пользователей, и ввод данных с клавиатуры просто необходим.
В целом раздел 2 будет посвящен считыванию данных с клавиатуры и оператору if, с помощью которого можно будет указать «если верно условие, то делать то-то». Также мы пройдём, какие для этого оператора бывают логические условия, узнаем альтернативу оператору «если» — switch. На основе этих инструментов мы сделаем программу-тест и калькулятор.
Считывание чисел, слов, данных с клавиатуры или из файла часто называют сканированием, поэтому в Java за сканирование отвечает класс Scanner. Рассмотрим код:
// Сравните 2 строчки кода: // объявить x типа int и приравнять числу 10 int x = 10; // объявить myscan класса Scanner и приравнять новому Сканеру Scanner myscan = new Scanner (System.in); // Как видите, наш класс очень похож на тип int. // На самом деле, класс - это просто набор данных в одном названии.
Сравните эти две строчки кода. Первая строчка гласит:
int x = 10; // Объявить переменную типа int с именем x, равную начальному значению 10.
Вторая гласит:
Scanner myscan = new Scanner (System.in); /* Объявить объект класса Scanner с именем myscan, равный новому сканеру с параметром System.in */
Это очень похожие вещи. Сначала мы указываем имя класса Scanner, точно также как обычно мы указываем имя типа int. После этого идет новое имя – мы называем конкретное целое число именем x, и называем конкретный сканер именем myscan.
После знака равно идет начальное значение – для переменной это просто 10, а вот для сканера мы должны использовать new. Этот оператор означает «создать новый» или более точно «заказать память под новый объект». На самом деле, при объявлении переменной под неё тоже заказывается память, но здесь памяти требуется больше и поэтому мы заказываем память явно именем new. После new идет имя класса, под который нужно заказать память – мы хотим сканер и указываем Scanner. В скобках идут уточняющие параметры – какой именно сканер.
В данном случае указываем параметром System.in. Это поток ввода текста с клавиатуры. In – с английского ввод, out – с английского вывод. System.out – поток вывода текста на экран. System.in – поток ввода текста с клавиатуры. Слово поток просто значит, что он считывает не одну клавишу, а последовательность нажатых клавиш.
В общем случае это выглядит так:
Класс Scanner.
Считывание символов
с клавиатуры
Вам может понадобиться возможность считать один единственный char. Например, для сохранения символа операции +, -, * или /, если вы пишите калькулятор, или ответа да-нет типа ‘y’ или ‘n’. Между тем Scanner представляет все возможности для считывания слов — он читает строки, целые и дробные числа, большие и малые числа, но вообще не предоставляет возможности прочесть один символ.
Возможно, так сделано потому, что Scanner задумывался как надстройка и расширение над базовой возможностью самого потока ввода System.in, который и предоставляет по сути одну функцию — прочесть символ с клавиатуры. Если вас устраивает возможность прочесть целое слово и при этом взять только самую начальную его букву, то можно написать так:
char c = myscan.next ().charAt (0); // next() дает слово, charAt (0) дает его символ под номером 0 // то есть мы получим необходимый нам символ
Функция next возвращает следующее слово, в нём может быть много букв. Более точно такое слово можно назвать String – строка. В строках может быть много букв, и через точку можно вызвать функцию, возвращающую букву по заданному номеру. Эту функцию зовут charAt, в скобках указывается номер символа, который мы хотим получить. Если интересует самый начальный символ, то нужно ввести ноль. Следующий символ будет 1, следующий – 2, и так далее. Это относительно простое решение, но здесь считывается в любом случае целое слово.
Возможно, что вам нужно прочесть один символ (один char), и вы не хотите читать для этого целое слово. Тогда можно написать так:
char c = (char) System.in.read ();
Теперь символ c можно будет использовать в программе, например, внутри условного оператора if (с == ‘+’) <…>.
…>
Помните, что конкретные значения символов мы указываем в кавычках: ‘a’, ‘b’, ‘c’, ‘+’, ‘1’ и т.д.
Как только вы напишите System.in.read () — система заголосит об ошибке. Чтобы её исправить, надо переиначить шапку main вот так, и все заработает:
public class JavaApplication5 < // осталось как было public static void main(String[] args) throws java.io.IOException < // добавили throws
Пояснение про throws exception. Эту фразу можно просто прочесть по-английски main throws IOException, что значит: main может кинуть исключения IO, т.е. ввода-вывода (in-out). Исключение - это остановка программы в том месте, когда она не может сработать нормально. То есть в обычных условиях все хорошо, но в исключительных (от сюда и название "исключение") - требуется обработка ошибки. Сейчас, дописав в заголовке main throws exception, мы просто предупредили систему, что это может произойти, и она успокоится.
Функция System.in.read() может кинуть исключение (по-английски throws exception). То есть когда программист видит, что данные явно ошибочны, можно написать "кинуть исключение" (throw exception). Так делает и функция read, если происходит что-то с потоком ввода, например, если клавиатура не подключена. Исключения нужно обрабатывать - писать код, который надо сделать, если произошла плохая ситуация. Мы это пройдем в будущем, а пока что просто передадим исключение наверх - пусть операционная система делает что хочет, если приложение сообщило об ошибке. Обычно она выведет на экран сообщение об ошибке и закроет программу, что нам сейчас и нужно. Чтобы передать исключение наверх, мы и пишем throws java.io.IOException.
Имейте в виду, System.in.read считывает всё по одному символу и, в отличие от Scanner, не разбирает таких тонкостей, как пробел или enter. Поэтому enter тоже считывается как обычный символ – у него есть свой код наравне с другими клавишами, обозначается '\n'. Учитывайте это, ведь обычно человек вводит не просто 'y', чтобы указать программе, как ей работать, но 'y'+'enter'. И второй enter будет считан вторым вызовом System.in.read ()
Самое главное мы уже освоили. Теперь время решать задачи. Ответьте на несколько вопросов, чтобы лучше усвоился новый материал:
Вопрос 1. В чем разница при использовании Scanner и System.in.read() на практике?
Во-первых, мы несколько по-разному пользуемся ими в коде - для Scanner нужно создать какой-либо объект и потом вызывать для этого объекта функции. System.in.read() можно вызвать без создания объекта, просто по имени функции.
Но главное - Scanner дает множество удобных функций для считывания чисел и строк, но строго одиночный символ прочесть не может - он читает слово до ближайшего пробела вызовом next (). А System.in.read() наоборот, читает только один символ за один запуск. Чтобы прочесть ещё пробел или enter, нужно вызвать его ещё раз.
Получение пользовательского ввода в Java
Очень часто при разработке программ на Java возникает потребность в получении данных от пользователя. Например, при создании калькулятора, необходимо получать от пользователя числа и операции, которые он хочет произвести с этими числами.
Одним из способов получения ввода от пользователя в Java является использование класса Scanner из стандартной библиотеки.
Класс Scanner
Класс Scanner предоставляет методы для чтения примитивных типов данных и строк. Для его использования, сначала необходимо импортировать класс из пакета java.util .
import java.util.Scanner;
Затем создается объект класса Scanner , который будет использоваться для чтения ввода.
Scanner scanner = new Scanner(System.in);
Здесь System.in является входным потоком, который соединен с консолью.
Теперь можно использовать созданный объект scanner для чтения данных. Например, чтобы получить целое число, можно использовать метод nextInt() .
int number = scanner.nextInt();
Аналогично, для получения строки используется метод nextLine() .
String text = scanner.nextLine();
Пример использования
Вот простой пример программы, которая запрашивает у пользователя число и выводит его на экран:
import java.util.Scanner; public class Main < public static void main(String[] args) < Scanner scanner = new Scanner(System.in); System.out.println("Введите число:"); int number = scanner.nextInt(); System.out.println("Вы ввели: " + number); >>
В этом примере, после ввода числа пользователем, оно будет считано методом nextInt() и затем выведено на экран.
Заключение
Класс Scanner — это мощный инструмент для получения ввода от пользователя. Он предоставляет набор методов для чтения различных типов данных, что делает его удобным для использования в широком диапазоне задач.