1. Чтение с консоли, System.in

В предыдущих лекциях мы познакомились с командами вывода на экран. Для этого мы использовали объект System.out, и его методы print() и println(). Просто и удобно.

Но, как вы уже наверное догадываетесь, одного вывода на экран недостаточно. Цель большинства программ — сделать что-то полезное для пользователя. Поэтому очень часто нужно, чтобы пользователь мог вводить данные с клавиатуры.

Как и для вывода, для ввода данных тоже есть специальный объект — System.in. Но, к сожалению для нас, он не настолько удобен, как нам бы хотелось. Этот объект позволяет считывать данные с клавиатуры по одному символу за раз.

Поэтому мы воспользуемся еще одним классом, который в паре с объектом System.in даст нам все, что нужно. В Java уже давно есть классы на все случаи жизни. С одним из них мы сейчас и познакомимся.


2. Класс Scanner

Класс Scanner (полное имя java.util.Scanner) умеет считывать данные из разных источников: консоль, файлы, интернет. Если мы хотим, чтобы он считывал данные с клавиатуры, мы должны передать ему объект System.in в качестве параметра – источника данных. А уж объект типа Scanner сам разберется, что с ним делать.

Считывание с клавиатуры с помощью объекта типа Scanner будет выглядеть примерно так:

Код Пояснение
Scanner console = new Scanner(System.in);
String name = console.nextLine();
int age = console.nextInt();
Создаем объект класса 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.


undefined
2
Задача
Java Syntax Pro, 2 уровень, 3 лекция
Недоступна
«Я по объявлению…»
В методе main объяви переменные intValue, numericValue, size, number типа int. Присвой им разные значения. Используй одну команду для создания и инициализации переменных. Значениями могут быть любые целые числа.

6. Другие методы класса Scanner

Это, кстати, были не все методы класса Scanner. Полный список будет выглядеть примерно так:

Метод Описание
nextByte()
Считывает данные и преобразует их в тип byte
nextShort()
Считывает данные и преобразует их в тип short
nextInt()
Считывает данные и преобразует их в тип int
nextLong()
Считывает данные и преобразует их в тип long
nextFloat()
Считывает данные и преобразует их в тип float
nextDouble()
Считывает данные и преобразует их в тип double
nextBoolean()
Считывает данные и преобразует их в тип boolean
next()
Считывает одно «слово». Слова разделяются пробелами или enter
nextLine()
Считывает целую строку

Есть еще методы, которые позволяют проверить тип еще не считанных данных (чтобы знать, каким методом их считывать).

Метод Описание
hasNextByte()
Там тип byte? Его можно будет преобразовать к byte?
hasNextShort()
Там тип short? Его можно будет преобразовать к short?
hasNextInt()
Там тип int? Его можно будет преобразовать к int?
hasNextLong()
Там тип long? Его можно будет преобразовать к long?
hasNextFloat()
Там тип float? Его можно будет преобразовать к float?
hasNextDouble()
Там тип double? Его можно будет преобразовать к double?
hasNextBoolean()
Там тип boolean? Его можно будет преобразовать к boolean?
hasNext()
Там есть еще одно слово?
hasNextLine()
Там есть еще одна строка?

7. Ввод данных из строки

Мы уже говорили выше, что класс Scanner умеет считывать данные из разных источников. И один из этих источников — строка текста.

Выглядеть это будет примерно так

String str = "текст";
Scanner scanner = new Scanner(str);

Вместо объекта System.in мы при создании объекта типа Scanner передаем в него строку – str. И теперь объект scanner будет считывать данные из строки. Пример:

Код программы: Пояснение:
import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      String str = "10 20 40 60";
      Scanner scanner = new Scanner(str);
      int a = scanner.nextInt();
      int b = scanner.nextInt();

      System.out.println(a + b);
   }
}






// a == 10;
// b == 20;
На экран будет выведено: 30