Перейти к основному содержимому

Ввод и вывод в Java

Play ITЗагрузка интерактивного демо…

Разработчику Архитектору

Для кого эта статья​

Статья рассчитана на тех, кто уже запустил первую программу в IDE или из терминала и хочет понять, как программа общается с пользователем через консоль.

Здесь — лестница из трёх коротких программ:

  1. вывод текста на экран;
  2. переменные и арифметика;
  3. ввод чисел с клавиатуры через Scanner.

Пакеты, классы как сущности ООП и продвинутый ввод-вывод в файлы — в основных конструкциях и ввод-вывод и файлы. Типы данных подробнее — в Типы данных и переменные в Java, операторы и циклы — в Операторы и циклы в Java.


Код в Java всегда внутри класса​

В отличие от Python или скриптового JavaScript, в Java нельзя написать исполняемую инструкцию "просто в файле". Любой рабочий код живёт внутри класса, а точка старта — в методе main.

Минимальный каркас (тот же, что в первой программе):

public class Demo {
public static void main(String[] args) {
// сюда пишем логику программы
}
}
ЭлементЗачем нужен
public class DemoИмя класса; файл должен называться Demo.java
public static void main(String[] args)Точка входа — JVM вызывает только этот метод при запуске (подробнее)
{ ... }Тело метода: инструкции выполняются сверху вниз
Консоль — первый интерфейс

На старте Java учат как консольный язык: программа читает данные из терминала и печатает результат в терминал. Окна, кнопки и веб-страницы — позже (Swing, JavaFX, Spring). Сначала важно освоить System.out и Scanner — те же приёмы работают и в серверных логах.


Что такое ввод и вывод​

Ввод (input) — данные, которые поступают в программу извне — с клавиатуры, из файла, по сети, с датчика. Пользователь или другая система "отправляет" информацию компьютеру, а программа её читает.

Вывод (output) — данные, которые программа отдаёт наружу после обработки — печатает в консоль, сохраняет в файл, рисует в окне, отправляет по HTTP. Это ответ программы на ввод или результат вычисления.

Пользователь → [ввод] → Программа → [обработка] → [вывод] → Пользователь
клавиатура main() консоль

В консольных учебных задачах стандартные потоки Java:

ПотокКласс / объектНазначение
Стандартный вводSystem.inБайты с клавиатуры (обычно оборачивают в Scanner)
Стандартный выводSystem.outТекст в консоль (методы print, println, printf)
Стандартный вывод ошибокSystem.errСообщения об ошибках (тоже консоль, часто другим цветом в IDE)

System — класс из стандартной библиотеки; out и in — его статические поля, доступные из любого места программы без создания объекта.


Программа 1 — вывод текста​

Самая короткая рабочая программа — одна строка в main:

public class Hello {
public static void main(String[] args) {
System.out.println("Привет, мир!");
}
}

Построчный разбор:

СтрокаЧто происходит
public class HelloОбъявляем класс Hello — контейнер для кода
public static void main(String[] args)JVM начинает выполнение отсюда
System.out.println("Привет, мир!");Вызов метода вывода: строка попадает в консоль, затем перевод строки

После компиляции и запуска в консоли появится:

Привет, мир!

Если вы работаете через Maven и IDE — см. первую программу; для запуска "вручную" без сборщика — classpath в той же статье.


Методы вывода: print, println, printf​

Все три метода вызываются у System.out — стандартного потока вывода.

println — вывод с переводом строки​

System.out.println("Первая строка");
System.out.println("Вторая строка");

Результат — две строки, каждая с новой линии. println = print line ("напечатать строку").

System.out.print("A");
System.out.print("B");
System.out.print("C");

Результат в одной строке: ABC. Удобно для приглашений к вводу: System.out.print("Введите число: "); — курсор остаётся на той же строке.

printf — форматированный вывод​

int age = 25;
double price = 19.99;
System.out.printf("Возраст: %d, цена: %.2f%n", age, price);
СпецификаторТипПример
%dцелое (int, long)System.out.printf("Шаг %d%n", 3);
%fвещественное (float, double)System.out.printf("%.2f%n", 3.14159); — два знака после запятой
%sстрокаSystem.out.printf("Имя: %s%n", "Анна");
%cсимволSystem.out.printf("Буква: %c%n", 'A');
%bлогическоеSystem.out.printf("Флаг: %b%n", true);
%nперевод строкиПлатформенно корректный аналог \n

Склеивание строк через +​

Для простого вывода можно соединять текст и значения оператором +:

int sum = 30;
System.out.println("Сумма = " + sum);

Java преобразует число в строку автоматически. Для сложных отчётов удобнее printf; для отладки — println с +.

Сравнение методов​

МетодПеревод строкиФорматированиеТипичное применение
printlnДаНетОбычные сообщения, логи
printНетНетПриглашение "Введите…"
printfЧерез %nДаТаблицы, отчёты, фиксированная ширина полей

Программа 2 — переменные и арифметика​

Программа считает сумму и произведение двух чисел, заданных в коде:

public class Calc {
public static void main(String[] args) {
int a = 10;
int b = 20;
int sum = a + b;
int product = a * b;

System.out.println("a = " + a + ", b = " + b);
System.out.println("Сумма = " + sum);
System.out.println("Произведение = " + product);
}
}

Ожидаемый вывод:

a = 10, b = 20
Сумма = 30
Произведение = 200

Объявление и использование переменных​

Переменная — именованная ячейка памяти с типом и значением. В Java тип указывают явно:

int count = 0; // целое
double rate = 0.15; // дробное
boolean active = true; // логическое
String name = "Java"; // строка (класс, не примитив)
ШагСинтаксисПример
Объявлениетип имя;int x;
Объявление с инициализациейтип имя = значение;int x = 5;
Изменениеимя = новоеЗначение;x = x + 1;

Имя переменной — camelCase (userName, totalAmount). Полный список типов — в типах данных.

Арифметические операторы​

ОператорДействиеПримерРезультат
+Сложение10 + 2030
-Вычитание20 - 1010
*Умножение10 * 20200
/Деление7 / 2 (int)3 — целочисленное деление
%Остаток7 % 21
++Инкрементi++увеличить на 1
--Декрементi--уменьшить на 1

Для дробного деления нужен тип double:

double result = 7.0 / 2; // 3.5

Порядок операций — как в математике — сначала *, /, %, затем +, -; скобки () меняют приоритет.


Программа 3 — ввод с клавиатуры (Scanner)​

Та же логика, но числа вводит пользователь:


import java.util.Scanner;

public class InputDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

System.out.print("Введите первое число: ");
int a = scanner.nextInt();

System.out.print("Введите второе число: ");
int b = scanner.nextInt();

int sum = a + b;
int product = a * b;

System.out.println("Сумма = " + sum);
System.out.println("Произведение = " + product);

scanner.close();
}
}

Пример сессии:

Введите первое число: 2
Введите второе число: 23
Сумма = 25
Произведение = 46

Разбор Scanner​

СтрокаСмысл
import java.util.Scanner;Подключить класс из стандартной библиотеки (пакет java.util)
new Scanner(System.in)Создать объект, читающий из стандартного ввода (клавиатура)
nextInt()Прочитать целое число из потока
close()Освободить ресурс (закрыть поток)

Основные методы чтения​

МетодВозвращаетКогда использовать
nextLine()StringЦелая строка до Enter
nextInt()intЦелое число
nextDouble()doubleДробное число
next()StringОдно слово до пробела
nextBoolean()booleantrue / false
hasNextInt()booleanПроверка: следующий токен — число?

Ловушка: nextInt() и пустая строка​

После nextInt() в буфере остаётся символ перевода строки. Следующий nextLine() может прочитать пустую строку:

System.out.print("Возраст: ");
int age = scanner.nextInt();

System.out.print("Город: ");
String city = scanner.nextLine(); // часто пусто!

Решение — "проглотить" остаток строки:

int age = scanner.nextInt();
scanner.nextLine(); // очистка буфера
String city = scanner.nextLine();

Подробнее о смешанном вводе — в основных конструкциях.

Ввод строки и числа в одной программе​


import java.util.Scanner;

public class Profile {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

System.out.print("Ваше имя: ");
String name = scanner.nextLine();

System.out.print("Ваш возраст: ");
int age = scanner.nextInt();

System.out.printf("Здравствуйте, %s! Вам %d лет.%n", name, age);
scanner.close();
}
}

Здесь сначала читаем строку, потом число — порядок без лишнего nextLine() между ними.


System.err — вывод ошибок​

Для сообщений об ошибках используют System.err — отдельный поток, визуально отделённый в IDE:

System.err.println("Файл не найден: config.properties");

На старте достаточно знать, что out — обычный вывод, err — ошибки. В продакшене оба часто перенаправляют в файлы логов.


Три программы — одна лестница​

ШагЧто новогоКлючевые конструкции
1Текст на экранclass, main, System.out.println
2Данные в кодеint, =, +, *
3Данные с клавиатурыimport, Scanner, nextInt, print
Практика

Измените программу 3: добавьте вывод разности и частного (с учётом деления на ноль). Затем возьмите задачи из Lab — консольные задачи или мини-приложения в 131.md.


Частые ошибки​

СимптомПричинаЧто сделать
cannot find symbol: class ScannerНет import java.util.Scanner;Добавить import в начало файла
InputMismatchExceptionВвели буквы вместо числа в nextInt()Проверять hasNextInt() или обрабатывать исключение (Обработка исключений в Java)
Пустой город после nextInt()Не очищен буферВызвать nextLine() после числа
Код вне классаВ Java нет "голых" инструкцийОбернуть в class и main
Кириллица "кракозябрами" в консоли WindowsКодировка терминалаUTF-8 в IDE; в cmd — chcp 65001

Что изучать дальше​

ТемаСтатья
Типы, литералы, StringТипы данных и переменные в Java
if, switch, циклыОператоры и циклы в Java
Пакеты, методы, перегрузкаОсновные конструкции языка Java
Classpath без MavenПервая программа на Java
Отладка в IDEAОтладка Java-кода в IDE
Файлы и потокиВвод-вывод и файлы в Java
Задачи с разборомLab — консольные задачи

В подборках​

Статья входит в маршрут раздела Java — о разделе. Соседние шаги: первая программа, точка входа main, типы.