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

Консольный ввод и вывод в Kotlin

Разработчику

Консольный ввод и вывод

Многие первые программы на Kotlin — консольные: текст в терминале, ввод с клавиатуры, без окон и кнопок. Так же устроены утилиты сборки, скрипты миграции и серверы вроде Ktor — они пишут логи в консоль, даже если основная работа идёт по сети.

Старт с нуля: первая программа. Дальше — корутины, коллекции.


Словарь терминов

ТерминПростыми словами
Консоль / терминалОкно, куда программа печатает текст и откуда читает ввод пользователя.
stdoutСтандартный поток вывода — обычный текст (println).
stderrПоток для сообщений об ошибках — отделён от обычного вывода.
stdinСтандартный ввод — то, что пользователь набирает с клавиатуры.
Аргументы командной строкиСлова после имени программы: java -jar app.jar Анна 25Анна, 25.
Интерполяция строкВставка переменных в строку: "Привет, $name".

Вывод в консоль

fun main() {
print("Введите имя: ") // без перевода строки в конце
println("Готово.") // с переводом строки
System.err.println("Ошибка конфигурации") // в stderr
}
ФункцияЭффект
print(...)Печать без \n в конце
println(...)Печать и переход на новую строку
System.err.printlnСообщение об ошибке (в IDE часто красным)

Интерполяция

val n = 42
println("Ответ: $n, квадрат: ${n * n}")
  • $n — подставить значение переменной.
  • ${n * n} — подставить результат выражения (всё внутри фигурных скобок).

Многострочный текст

val help = """
Использование: app <имя>
Пример: app Анна
""".trimIndent()
println(help)

Тройные кавычки сохраняют переносы; trimIndent() убирает общий отступ слева.


Ввод с клавиатуры

С Kotlin 1.6+ для учебных задач удобен readln():

fun main() {
print("Имя: ")
val name = readln()
print("Возраст: ")
val age = readln().toIntOrNull() ?: run {
println("Нужно целое число")
return
}
println("Привет, $name! Через год вам будет ${age + 1}.")
}

Разбор:

СтрокаСмысл
readln()Ждёт Enter, возвращает строку без символа перевода строки.
toIntOrNull()Преобразует "42"42, "abc"null без падения программы.
?: run { ... return }Если число не распарсилось — напечатать сообщение и выйти из main.

readLine() — вариант с nullable

val line = readLine()
if (line.isNullOrBlank()) {
println("Пустой ввод")
}

readLine() совместим с Java API и возвращает String? (null при конце ввода / EOF).


Аргументы командной строки

fun main(args: Array<String>) {
if (args.isEmpty()) {
println("Укажите имя: app <имя>")
return
}
val name = args[0]
val greet = args.getOrElse(1) { "Привет" }
println("$greet, $name!")
}
ВыражениеПример args = ["Анна", "Здравствуй"]
args[0]"Анна"
args.getOrElse(1) { "Привет" }"Здравствуй"; если второго нет — "Привет"

Запуск:

./gradlew run --args="Анна"
java -jar app.jar Анна Здравствуй

В IntelliJ IDEA: Run → Edit Configurations → Program arguments.


Цикл «меню»

fun main() {
while (true) {
println("1 — сложить 2 — выход")
when (readln().trim()) {
"1" -> {
val a = readln().toIntOrNull() ?: continue
val b = readln().toIntOrNull() ?: continue
println(a + b)
}
"2" -> break
else -> println("Неизвестная команда")
}
}
}
  • when — аналог switch с удобными ветками.
  • continue — пропустить итерацию и снова показать меню, если ввод не число.
  • break — выйти из while.

Без toIntOrNull() строка "два" вызовет NumberFormatException и программа упадёт.


Чтение файла

import java.io.File

fun main() {
val path = readln().trim()
val lines = File(path).readLines()
println("Строк: ${lines.size}")
lines.take(5).forEach { println(it) }
}

readLines() загружает весь файл в память. Для гигабайтных логов используйте Sequence и useLines { }.


Кодировка и Windows

Консоль Windows иногда показывает кириллицу некорректно.

  • PowerShell: chcp 65001 перед запуском (UTF-8).
  • Gradle run: JVM-флаг -Dfile.encoding=UTF-8.

В Linux и macOS UTF-8 обычно уже включён.


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

СимптомПричина
NumberFormatExceptiontoInt() вместо toIntOrNull()
Пустая строка после readln()Пользователь нажал Enter без текста — проверяйте isBlank()
Кракозябры в WindowsКодировка консоли — см. выше

Связанные материалы


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).