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
Все, что находится слева от знака равно — это объявление переменной типа 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;
На экран будет выведено: |
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ