Консольный ввод/вывод, импорт пакетов

Наиболее простой способ взаимодействия с пользователем представляет консоль: мы можем выводить в консоль некоторую информацию или, наоборот, считывать из консоли какие-либо данные.

Для вывода информации в консоль используется класс System и его объект out. У этого объекта есть несколько полезных распространенных функций для вывода:

  • System.out.print – вывод данных без перехода на следующую строку;
  • System.out.println – вывод данных с переходом на новую строку;
  • System.out.printf – форматированный вывод данных.

Рассмотрим их по порядку. Если в программе вызвать два вот таких метода:

System.out.print("Hello ");
System.out.print("World!");

то в консоле мы увидим сообщение «Hello World!» в одну строку, без переноса строк, так как метод print не выполняет автоматический перенос на следующую строку. Правда мы можем сделать это самостоятельно, если пропишем символ ‘\n’ – перевода строки после первого слова «Hello»:

System.out.print("Hello\n");

В этом случае второе слово будет отображаться на следующей строке. Запомним этот символ переноса строки. Это универсальный символ, который применяется повсюду, а не только в этой функции.

Если же нам нужно вывести сообщение в строку с автоматическим переходом на новую строку, то вместо print следует использовать метод println:

System.out.println("Hello");
System.out.print("World!");

Смотрите, здесь нет символа перевода строки, но слово «World!» все равно отобразилось с новой строки. Вот в этом отличие между print и println.

Далее, с помощью этих функций можно выводить значения переменных, используя такие варианты:

short x = 5;
double y = 4.5;
 
System.out.println(x);
System.out.println("x = " + x);
System.out.println("x = " + x + ", y = " + y);

Вот эти плюсы здесь означают соединение двух строк, т.е. в конец первой строки добавляется вторая (либо числовое значение переменной, которое затем будет представлено в виде единой строки).

Наконец, для тех кто знаком с языком С/С++ в Java есть функция printf, которая работает также и служит для форматированного вывода информации в консоль. Синтаксис этого метода такой:

System.out.printf(<шаблон формата>, [список аргументов]);

Например, мы можем вывести переменные x и y с помощью этой функции так:

short x = 5;
double y = 4.5;
float z = 1.2f;
 
System.out.printf("x = %d, y = %f, z = %.2f\n", x, y, z);

Здесь вот эти %d, %f – это так называемые спецификаторы, на место которых подставляется значение соответствующей переменной, указанных после шаблона. Причем, %d – спецификатор для вывода целочисленных значений, %f – для вещественных. Наиболее употребительные спецификаторы следующие:

  • %d – для целочисленных значений;
  • %f – для вещественных значений;
  • %.nf –вывод вещественного значения с точностью до n-го знака после запятой;
  • %c – для отдельного символа (тип char);
  • %s – для строк;
  • %% - вывод процентов.

Обратите внимание, когда мы инициализировали переменную z вещественным значением, то в конце поставили букву f. Эта буква определяет вещественное число типом float. Если такая буква отсутствует у вещественного числа, то оно по умолчанию определяется как double.

С выводом данных в целом разобрались. Теперь посмотрим как можно вводить данные с клавиатуры. Для этого в классе System определен объект in. Но через него не очень удобно работать. Поэтому используют другой класс Scanner, который является некой надстройкой над объектом System.in и предоставляет более удобный инструментарий для ввода значений с клавиатуры.

Этот класс определен в пакете java.util, поэтому для доступа к нему следует сначала прописать этот пакет, а затем, указать сам класс:

java.util.Scanner in = new java.util.Scanner(System.in);

Но каждый раз вот так прописывать java.util.Scanner не очень то удобно. Поэтому мы сделаем так. Импортируем этот пакет с классом Scanner в нашу программу:

import java.util.Scanner;

И теперь все можно записать проще:

Scanner in = new Scanner(System.in);

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

Теперь через ссылку in мы можем обращаться к открытым методам объекта Scanner. Например, для ввода целочисленных значений, достаточно записать:

int num = in.nextInt();

Мы здесь объявляем переменную num и сразу ее инициализируем значением, введенным с клавиатуры. То есть, метод nextInt() объекта Scanner реализует ввод целочисленного значения и, затем, возвращает полученный результат.

Далее, выведем введенное значение в консоль, чтобы убедиться, что все работает:

System.out.printf("Your number: %d \n", num);

И после окончания работы с входным потоком, его нужно закрыть:

in.close();

Вот пример ввода целочисленного значения с клавиатуры. В общем случае в классе Scanner реализованы такие полезные методы:

  • next(): считывает введенную строку до первого пробела;
  • nextLine(): считывает введенную строку до перевода строки;
  • nextByte(): считывает введенное число как byte;
  • nextShort(): считывает введенное число как short;
  • nextInt(): считывает введенное число как тип int;
  • nextDouble(): считывает введенное число как double;
  • nextFloat(): считывает введенное число как float;
  • nextBoolean(): считывает значение boolean.

То есть для ввода значений каждого примитивного типа в классе Scanner определен свой метод. Что очень удобно. Например, напишем такую программу для ввода информации о человеке:

import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
 
        Scanner in = new Scanner(System.in);
        System.out.print("Input name: ");
        String name = in.nextLine();
        System.out.print("Input age: ");
        int age = in.nextInt();
        System.out.print("Input height: ");
        float height = in.nextFloat();
        System.out.printf("Name: %s  Age: %d  Height: %.2f \n", name, age, height);
        in.close();
    }
}

И обратите внимание, когда мы вводим вещественное значение, то мне приходится вводить его через запятую. Если пишется точка, то возникает исключение некорректного ввода данных. Это связано с настройкой языковой локализации на конкретном компьютере. И у вас, возможно, с другой настройкой нужно будет писать точку. Вот такой существует нюанс, который сейчас просто имейте в виду.

Вот так в Java реализуется консольный вывод и ввод информации. И вы теперь знаете как это все работает.