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

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

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

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

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

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

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

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


Код в 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() или обрабатывать исключение (21.md)
Пустой город после nextInt()Не очищен буферВызвать nextLine() после числа
Код вне классаВ Java нет «голых» инструкцийОбернуть в class и main
Кириллица «кракозябрами» в консоли WindowsКодировка терминалаUTF-8 в IDE; в cmd — chcp 65001

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

ТемаСтатья
Типы, литералы, String15.md
if, switch, циклы17.md
Пакеты, методы, перегрузка16.md
Classpath без Maven13.md
Отладка в IDEA132.md
Файлы и потоки297.md
Задачи с разборомLab — консольные задачи

В подборках

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