Ввод и вывод в Java
Для кого эта статья
Статья рассчитана на тех, кто уже запустил первую программу в IDE или из терминала и хочет понять, как программа общается с пользователем через консоль.
Здесь — лестница из трёх коротких программ:
- вывод текста на экран;
- переменные и арифметика;
- ввод чисел с клавиатуры через
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 («напечатать строку»).
print — вывод без перевода строки
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 + 20 | 30 |
- | Вычитание | 20 - 10 | 10 |
* | Умножение | 10 * 20 | 200 |
/ | Деление | 7 / 2 (int) | 3 — целочисленное деление |
% | Остаток | 7 % 2 | 1 |
++ | Инкремент | 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() | boolean | true / 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 |
Что изучать дальше
| Тема | Статья |
|---|---|
Типы, литералы, String | 15.md |
if, switch, циклы | 17.md |
| Пакеты, методы, перегрузка | 16.md |
| Classpath без Maven | 13.md |
| Отладка в IDEA | 132.md |
| Файлы и потоки | 297.md |
| Задачи с разбором | Lab — консольные задачи |
В подборках
Статья входит в маршрут раздела Java — о разделе. Соседние шаги: первая программа, точка входа main, типы.