Как в java вводить данные с клавиатуры
Мы рассмотрим класс Java под названием Scanner, который позволяет сохранить и обработать ввод пользователя с клавиатуры, превращая его в Java-код. Класс Scanner имеет разные методы получения информации в зависимости от типа переменной.
Одна из сильных сторон Java - это огромные доступные библиотеки кода. Это код, который был написан для выполнения определенной работы. Все, что вам нужно сделать, это указать, какую библиотеку вы хотите использовать, а затем вызвать метод в действие.
Один действительно полезный класс в Java, который обрабатывает ввод пользователя, называется классом Scanner . Класс Scanner можно найти в библиотеке java.util.
Чтобы использовать класс Scanner, вам нужно сослаться на него в своем коде. Это делается с помощью импорта ключевых слов.
Оператор import должен находиться чуть выше оператора Class:
Это говорит Java, что вы хотите использовать определенный класс в определенной библиотеке - класс Scanner, который находится в библиотеке java.util.
Следующее, что вам нужно сделать, это создать объект из класса Scanner. (Класс - это просто набор кода. Он ничего не делает, пока вы не создадите из него новый объект.)
Для создания нового объекта Scanner напишите код:
Вместо того, чтобы устанавливать переменную int или переменную String, мы настраиваем переменную Scanner. Мы назвали ее user_input.
После знака равенства у нас есть ключевое слово new. Оно используется для создания новых объектов из класса.
Мы создаем объект из класса Scanner. В скобках мы говорим Java, что это будет System Input и русская кодировка, чтоб ввод был распознан как русский текст (System.in, "Cp1251").
Чтобы получить пользовательский ввод, вы можете вызвать в действие один из методов, доступных для объекта Scanner.
Методы класса Scanner, которые обрабатывают ввод пользователя в Java:
- next(): получает введенную строку до первого пробела
- nextLine(): получает всю введенную строку
- nextInt(): получает введенное число int
- nextDouble(): получает введенное число double
- nextBoolean(): получает значение boolean
- nextByte(): получает введенное число byte (число от -128 до 127)
- nextFloat(): получает введенное число float
- nextShort(): получает введенное число short (число от -32768 до 32767)
Для нашего нового объекта Scanner мы будем использовать метод next:
Чтоб увидеть весь список доступных методов, введите после нашего объекта user_input точку. Нам нужен next. Дважды кликните по next и введите точку с запятой, чтобы завершить строку. Также мы напечатаем некоторый текст, как предложение о вводе данных:
Обратите внимание, что мы использовали print, а не println, как в прошлый раз. Разница между ними заключается в том, что println переместит курсор на новую строку после вывода, а print оставит курсор на той же строке.
Также мы добавим предложение о вводе фамилии:
Это тот же код, за исключением того, что java теперь будет хранить все, что пользователь вводит, в нашу переменную family_name вместо переменной first_name.
Чтобы распечатать ввод, мы можем добавить следующее:
Мы установили еще одну переменную String - full. В ней мы сохраним все, что есть в двух переменных first_name и family_name (в строке ввода ввел пользователь). Между ними мы добавили пробел. Последняя строка выводит все это в окно вывода.
Адаптируйте ваш код так, чтобы он соответствовал следующему изображению:
Запустите программу, и в окне «Вывод» отобразится следующее:
На этом этапе Java приостанавливается, пока вы не введете что-либо на клавиатуре. Работа кода не продолжиться, пока вы не нажмете клавишу ввода. Итак, кликните левой кнопкой мыши после «Введите имя:», и вы увидите, что курсор мигает. Введите имя и нажмите клавишу ввода на клавиатуре.
После того, как вы нажмете клавишу ввода, java возьмет то, что было набрано, и сохранит его в имени переменной слева от знака равенства. Для нас это была переменная с именем first_name.
Затем программа переходит к следующей строке кода:
Введите фамилию и снова нажмите клавишу ввода:
Пользовательский ввод завершен, а остальная часть программы выполняется. Это вывод двух имен. Конечный результат должен выглядеть так:
Таким образом, мы использовали класс Scanner для получения ввода от пользователя. Все, что было напечатано, сохранилось в переменных. Затем результат был напечатан в окне вывода.
При работе с приложениями или сайтами, пользователям необходимо вводить свои данные: почту, пароль, день рождения и так далее. В Java применяются несколько способов ввода данных с клавиатуры: c помощью метода readLine() класса BufferedReader или метода nextLine() класса Scanner. Разберем подробнее, как работают эти методы.
Метод readLine()
BufferedReader readLine() применяется для чтения одной строки текста, который пользователь ввел с консоли. Конец строки в коде может быть указан как Enter, так и \n , \r или EOF — end of file.
BufferedReader readLIne() работает только со строками в коде. А метод Scanner nextLine() считывает и другие типы данных, например, int, long, double, float.
BufferedReader работает немного быстрее по сравнению со Scanner, потому что nextLine() анализирует данные, а readLine() просто считывает последовательность символов.
Так работает readLine():
И на экран, соответственно, выводится:
Метод nextLine()
NextLine() в Java применяется для класса Scanner. Этот метод так же, как и readLine(), нужен для получения и чтения данных, написанных пользователем. Чтобы применить nextLine(), в коде нужно прописать объект Scanner.
Этот метод читает и воспроизводит данные до конца строки. Другими словами, он может считывать информацию до тех пор, пока не начнется новая строка или старая не будет разорвана с помощью \n или Enter.
Вот как nextLine() работает в Java:
Что пишет пользователь:
Что показывает программа:
Метод nextLine работает с данными только одной строки, поэтому остальное стихотворение теряется из-за разрыва между предложениями и перехода на новую строчку.
Чтобы показать стих полностью, нужно написать следующий код:
Классы-обертки в Java
Класс-обертка — это класс, объект которого содержит примитивные типы данных. Когда мы создаем объект для класса-обертки, он содержит поле, в котором мы можем хранить примитивные типы данных.
Как работают классы-обертки:
- Они преобразуют примитивные типы данных в объекты. Это необходимо, когда мы хотим изменить аргументы, передаваемые через метод (поскольку примитивные типы передаются только через value).
- В пакете java.util классы могут обрабатывать только объекты, и в этом случае помогут обертки.
- Чтобы работать в коллекциях ArrayList и Vector, потребуются объекты, а не примитивные типы.
- Классы-обертки необходимы для поддержки синхронизации в режиме многопоточности.
В коде процесс создания классов-оберток выглядят так:
А если нужно совершить обратный процесс и преобразовать класс-обертку в примитивный тип, то придется совершить unboxing или распаковку данных:
Highload нужны авторы технических текстов. Вы наш человек, если разбираетесь в разработке, знаете языки программирования и умеете просто писать о сложном!
Откликнуться на вакансию можно здесь .
В предыдущих лекциях мы познакомились с командами вывода на экран. Для этого мы использовали объект System.out , и его методы print() и println() . Просто и удобно.
Но, как вы уже наверное догадываетесь, одного вывода на экран недостаточно. Цель большинства программ — сделать что-то полезное для пользователя. Поэтому очень часто нужно, чтобы пользователь мог вводить данные с клавиатуры.
Как и для вывода, для ввода данных тоже есть специальный объект — System.in . Но, к сожалению для нас, он не настолько удобен, как нам бы хотелось. Этот объект позволяет считывать данные с клавиатуры по одному символу за раз.
Поэтому мы воспользуемся еще одним классом, который в паре с объектом System.in даст нам все, что нужно. В Java уже давно есть классы на все случаи жизни. С одним из них мы сейчас и познакомимся.
2. Класс Scanner
Считывание с клавиатуры с помощью объекта типа Scanner будет выглядеть примерно так:
Код | Пояснение |
---|---|
Создаем объект класса Scanner . Читаем с клавиатуры строку текста . Читаем с клавиатуры число . |
Выглядит вроде несложно, но так ли все просто на самом деле?
Думаю, у вас появилась куча вопросов, и сейчас мы на них ответим.
Но для начала продемонстрируем пример полной программы, где используется класс Scanner :
3. Создание объекта Scanner
Такая строка может сбивать с толку, однако вы будете постоянно встречать похожие вещи. Так что, думаем, настало время объяснить, что тут написано.
Вспомним, как мы обычно создаем переменную с текстом:
Сначала мы пишем тип переменной ( String ), затем ее имя ( str ) и, наконец, после знака равно пишем значение.
В нашей странной строке на самом деле все то же самое:
Объявление и инициализация переменной типа ScannerВсе, что находится слева от знака равно — это объявление переменной типа Scanner по имени console . Можно было назвать ее, например, s или scanner , или даже keyboard . Тогда код выглядел бы так:
Думаю, теперь все стало гораздо понятнее.
А код, что находится справа от знака равно , немного сложнее. Имеется в виду new Scanner(System.in); Но тут тоже ничего космического.
В этом коде мы говорим Java-машине: создай новый объект (слово new ) типа Scanner и передай в него в качестве параметра то, из чего новосозданный объект Scanner будет брать данные — объект System.in .
После выполнения всей этой строки у нас появится переменная по имени console типа Scanner , с помощью которой наша программа сможет считывать данные с клавиатуры.
4. Вызов методов
В приведенном выше примере наша переменная console типа Scanner хранила у себя внутри ссылку на объект типа Scanner .
Чтобы вызвать методы объекта, на который ссылается переменная, нужно после имени переменной написать точку, а затем имя метода и параметры. Общий вид этой команды такой:
Вызов метода объекта, на который ссылается переменнаяЕсли вы не планируете передавать в функцию параметры, нужно писать просто пустые скобки:
5. Ввод данных с консоли
Вводить данные с клавиатуры, когда у нас есть объект типа Scanner , очень легко.
Чтобы считать с клавиатуры строку , нужна команда:
Когда программа дойдет до выполнения этой строки, она приостановится и будет ждать, пока пользователь введет данные и нажмет клавишу enter. После этого все, что ввел пользователь, будет сохранено в переменную str .
Чтобы считать с клавиатуры число , нужна команда:
Тут все аналогично предыдущей команде. Когда программа дойдет до выполнения этой строки, она приостановится и будет ждать, пока пользователь введет данные и нажмет клавишу enter. После этого все, что ввел пользователь, будет преобразовано в число и сохранено в переменную number .
Если пользователь ввел данные, которые невозможно преобразовать в целое число, в программе возникнет ошибка, и она завершится.
Чтобы считать с клавиатуры дробное число , нужна команда:
Эта команда полностью аналогична команде nextInt() , только она проверяет, что введенные данные можно преобразовать в число double .
Пример программы, которая считывает с клавиатуры два числа и выводит их сумму:
Пользователь может ввести несколько чисел в одной строке, разделив их пробелами: такая ситуация будет корректно обработана методами класса Scanner . Однако числа будут считаны программой только после того, как пользователь нажмет Enter .
Считай с клавиатуры три строки. А затем: 1. Выведи на экран третью строку в неизменном виде. 2. Выведи на экран вторую строку, предварительно преобразовав ее к верхнему регистру. 3. Выведи на экран первую строку, предварительно преобразовав ее к нижнему регистру. Пример ввода: Строка Номер РАЗ Втор Считай с клавиатуры три целых числа. Выведи на экран их среднее арифметическое. Пример ввода: 50 101 201 Пример вывода: 117 Среднее арифметическое - это число, равное сумме всех чисел, деленной на их количество. Используй деление без остатка.6. Другие методы класса Scanner
Это, кстати, были не все методы класса Scanner . Полный список будет выглядеть примерно так:
Метод | Описание |
---|---|
Считывает данные и преобразует их в тип byte | |
Считывает данные и преобразует их в тип short | |
Считывает данные и преобразует их в тип int | |
Считывает данные и преобразует их в тип long | |
Считывает данные и преобразует их в тип float | |
Считывает данные и преобразует их в тип double | |
Считывает данные и преобразует их в тип boolean | |
Считывает одно «слово». Слова разделяются пробелами или enter | |
Считывает целую строку |
Есть еще методы, которые позволяют проверить тип еще не считанных данных (чтобы знать, каким методом их считывать).
Метод | Описание |
---|---|
Там тип byte ? Его можно будет преобразовать к byte ? | |
Там тип short ? Его можно будет преобразовать к short ? | |
Там тип int ? Его можно будет преобразовать к int ? | |
Там тип long ? Его можно будет преобразовать к long ? | |
Там тип float ? Его можно будет преобразовать к float ? | |
Там тип double ? Его можно будет преобразовать к double ? | |
Там тип boolean ? Его можно будет преобразовать к boolean ? | |
Там есть еще одно слово? | |
Там есть еще одна строка? |
7. Ввод данных из строки
Мы уже говорили выше, что класс Scanner умеет считывать данные из разных источников. И один из этих источников — строка текста .
В Java используются два основных способа ввода данных с клавиатуры:
С помощью метода readLine() объекта, порожденного от класса BufferdReader из пакета java.io.
С помощью nextLine() и других методов объекта, созданного от класса Scanner из пакета java.util.
Однако в обоих случаях изначально используется System.in – объект класса InputStream, присвоенный переменной in, находящейся в классе System пакета java.lang. Данный объект выполняет функцию стандартного потока ввода, т. е. ввода с клавиатуры. (В то время как System.out – стандартный поток вывода.)
В Java объект System.in обеспечивает низкоуровневый ввод, при котором методом read() считываются байты. Например, если ввести "ab" и нажать Enter, будет прочитано три байта. В десятичном представлении значение первого байта будет соответствовать символу "a" по таблице символов, второго – символу "b", третьего – символу перехода на новую строку.
Если же ввести букву национального алфавита, которая не может кодироваться одним байтом, то каждый ее составляющий байт будет прочитан по отдельности.
Для преобразования байтов в символы, а затем в строки полученное от System.in передают в конструкторы классов-оберток. Обертки используют функционал переданного им объекта, но дополняют его своим.
Первая обертка – класс InputStreamReader, который преобразует набор байтов в символ. Класс BufferedReader буферизует ввод, обеспечивая считывание из потока ввода (клавиатура это или файл – не важно) целых строк, что делает процесс более быстрым.
Выражение BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); есть сокращенная запись от:
В случае Scanner дело обстоит попроще, так как класс может больше:
У сканера есть методы, проверяющие тип вводимых данных (hasNextInt() и т. п.). Несмотря на удобство Scanner, если надо просто считывать строки без их анализа, предпочитают использовать BufferedReader, так как он работает быстрее. В остальном выбор зависит от специфики задачи.
Метод вывода в консоль System.out.println (x), где x - переменная, содержащая число, выводит максимальное количество ненулевых цифр числа x, заданных типом. Например:
выведет на экран число :
Данная точность вывода иногда бывает избыточной для представления результатов вычислений. Для того, чтобы числа можно было представить в требуемом формате в Java SE применяется метод System.out.println (). Например последовательность команд
выведет на экран строку :
Обычный текст выводится на экран без изменений. Значение числа отображается согласно спецификации преобразования данных. Спецификация преобразования начинается с символа '%' и заканчивается спецификатором. Некоторые спецификаторы указаны в следующей таблице:
Спецификатор | Тип значения |
---|---|
d | целое десятичное число |
f | десятичная форма вещественного числа |
e | экспоненциальная форма вещественного числа |
s | строка |
c | символ |
b | boolean |
Для представления числовых значений бывает полезным использовать в спецификации преобразования указание ширины поля и точности. Ширина поля и точность последовательно указываются между '%' и спецификатором и отделяются друг от друга точкой.
Ширина поля - целое положительное число, определяющее длину (в символах экрана) представления выводимого значения (позиции на знак числа и десятичную точку входят в ширину поля вывода).
Точность - целое положительное число, определяющее количество цифр в дробной части внешнего представления числа (с фиксированной точкой) или его мантиссы (при использовании формы с плавающей точкой).
Ввод данных с клавиатуры, Scanner
Для ввода данных с клавиатуры необходимо создать объект, который будет использоваться для чтения из стандартного потока ввода. Этот объект имеет тип Scanner, описанный в пакете java.util. Класс необходимо импортировать в программу, использующую команды ввода данных из какого-либо потока.
Пример ввода данных:
Для ввода целых чисел используется метод nextInt(), для дробных - nextDouble().
Блокирование ввода и вывода
Для блокирования ввода/вывода необходимо закрыть входные и выходные потоки.
Читайте также: