1. Чтение с консоли, System.in
В предыдущих лекциях мы познакомились с командами вывода на экран. Для этого мы использовали объект System.out
, и его методы print()
и println()
. Просто и удобно.
Но, как вы уже наверное догадываетесь, одного вывода на экран недостаточно. Цель большинства программ — сделать что-то полезное для пользователя. Поэтому очень часто нужно, чтобы пользователь мог вводить данные с клавиатуры.
Как и для вывода, для ввода данных тоже есть специальный объект — System.in
. Но, к сожалению для нас, он не настолько удобен, как нам бы хотелось. Этот объект позволяет считывать данные с клавиатуры по одному символу за раз.
Поэтому мы воспользуемся еще одним классом, который в паре с объектом System.in
даст нам все, что нужно. В Java уже давно есть классы на все случаи жизни. С одним из них мы сейчас и познакомимся.
2. Класс Scanner
Класс Scanner
(полное имя java.util.Scanner
) умеет считывать данные из разных источников: консоль, файлы, интернет. Если мы хотим, чтобы он считывал данные с клавиатуры, мы должны передать ему объект System.in
в качестве параметра – источника данных. А уж объект типа Scanner сам разберется, что с ним делать.
Считывание с клавиатуры с помощью объекта типа Scanner
будет выглядеть примерно так:
Код | Пояснение |
---|---|
|
Создаем объект класса Scanner .Читаем с клавиатуры строку текста. Читаем с клавиатуры число. |
Выглядит вроде несложно, но так ли все просто на самом деле?
Думаю, у вас появилась куча вопросов, и сейчас мы на них ответим.
Но для начала продемонстрируем пример полной программы, где используется класс Scanner
:
import java.util.Scanner;
public class Solution {
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
String name = console.nextLine();
int age = console.nextInt();
System.out.println("Name: " + name);
System.out.println("Age: " + age);
}
}
3. Создание объекта Scanner
Первый вопрос – что это за строка Scanner console = new Scanner(System.in);
?
Такая строка может сбивать с толку, однако вы будете постоянно встречать похожие вещи. Так что, думаем, настало время объяснить, что тут написано.
Вспомним, как мы обычно создаем переменную с текстом:
String str = "текст";
Сначала мы пишем тип переменной (String
), затем ее имя (str
) и, наконец, после знака равно пишем значение.
В нашей странной строке на самом деле все то же самое:
Scanner console = new Scanner(System.in);
Все, что находится слева от знака равно — это объявление переменной типа Scanner
по имени console
. Можно было назвать ее, например, s
или scanner
, или даже keyboard
. Тогда код выглядел бы так:
Scanner s = new Scanner(System.in);
String name = s.nextLine();
int age = s.nextInt();
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int age = scanner.nextInt();
Scanner keyboard = new Scanner(System.in);
String name = keyboard.nextLine();
int age = keyboard.nextInt();
Думаю, теперь все стало гораздо понятнее.
А код, что находится справа от знака равно, немного сложнее. Имеется в виду new Scanner(System.in);
Но тут тоже ничего космического.
В этом коде мы говорим Java-машине: создай новый объект (слово new
) типа Scanner
и передай в него в качестве параметра то, из чего новосозданный объект Scanner
будет брать данные — объект System.in
.
После выполнения всей этой строки у нас появится переменная по имени console
типа Scanner
, с помощью которой наша программа сможет считывать данные с клавиатуры.
4. Вызов методов
В приведенном выше примере наша переменная console
типа Scanner
хранила у себя внутри ссылку на объект типа Scanner
.
Чтобы вызвать методы объекта, на который ссылается переменная, нужно после имени переменной написать точку, а затем имя метода и параметры. Общий вид этой команды такой:
переменная.метод(параметры);
Примеры:
System.out.println("Привет");
System.out.println(1);
Если вы не планируете передавать в функцию параметры, нужно писать просто пустые скобки:
переменная.метод();
Пример:
System.out.println();
5. Ввод данных с консоли
Вводить данные с клавиатуры, когда у нас есть объект типа Scanner
, очень легко.
Чтобы считать с клавиатуры строку, нужна команда:
String str = console.nextLine();
Когда программа дойдет до выполнения этой строки, она приостановится и будет ждать, пока пользователь введет данные и нажмет клавишу enter. После этого все, что ввел пользователь, будет сохранено в переменную str
.
Чтобы считать с клавиатуры число, нужна команда:
int number = console.nextInt();
Тут все аналогично предыдущей команде. Когда программа дойдет до выполнения этой строки, она приостановится и будет ждать, пока пользователь введет данные и нажмет клавишу enter. После этого все, что ввел пользователь, будет преобразовано в число и сохранено в переменную number
.
Если пользователь ввел данные, которые невозможно преобразовать в целое число, в программе возникнет ошибка, и она завершится.
Чтобы считать с клавиатуры дробное число, нужна команда:
double number = console.nextDouble();
Эта команда полностью аналогична команде nextInt()
, только она проверяет, что введенные данные можно преобразовать в число double
.
Пример программы, которая считывает с клавиатуры два числа и выводит их сумму:
import java.util.Scanner;
public class Solution {
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
int a = console.nextInt();
int b = console.nextInt();
System.out.println(a + b);
}
}
Пользователь может ввести несколько чисел в одной строке, разделив их пробелами: такая ситуация будет корректно обработана методами класса Scanner
. Однако числа будут считаны программой только после того, как пользователь нажмет Enter
.
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
умеет считывать данные из разных источников. И один из этих источников — строка текста.
Выглядеть это будет примерно так
String str = "текст";
Scanner scanner = new Scanner(str);
Вместо объекта System.in
мы при создании объекта типа Scanner
передаем в него строку –
str
. И теперь объект scanner
будет считывать данные из строки. Пример:
Код программы: | Пояснение: |
---|---|
|
// a == 10;
// b == 20;
На экран будет выведено:
|
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ