Kotlin: автоматизация рутины. Пишем утилиты, которые реально экономят время

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Автоматизация на Kotlin: почему это стоит вашего внимания

Вы когда-нибудь тратили час на переименование сотни файлов, ручной парсинг логов или копирование данных из одного API в другое? Знакомая боль. Обычно для таких задач мы тянемся к Python или Bash, но Kotlin — неожиданно мощный и элегантный инструмент для автоматизации на Kotlin. Он сочетает лаконичность современного языка с производительностью JVM и полным доступом к экосистеме Java.

В этой статье мы не будем писать очередной «Hello, World». Мы сразу перейдем к делу: разберем Kotlin примеры кода, которые реально пригодятся в повседневной работе разработчика, сисадмина или тестировщика. Вы узнаете, как писать Kotlin скрипты для работы с файлами, отправки HTTP-запросов, парсинга данных и запуска системных команд. Поехали!

Почему Kotlin, а не Python или Bash?

У каждого языка своя ниша. Bash идеален для быстрых однострочников, Python — для сложной логики и data science. Но Kotlin для автоматизации дает несколько уникальных преимуществ:

  • Типобезопасность. Вы не получите ошибку «string vs int» в рантайме — компилятор поймает её на старте.
  • Полная совместимость с Java. Любая Java-библиотека (Apache POI, OkHttp, Jackson) доступна из коробки.
  • Kotlin Script (.kts). Можно писать скрипты без компиляции — запускайте как обычный .sh файл.
  • Лаконичный синтаксис. Меньше шаблонного кода, больше читаемости.

Настройка окружения для Kotlin-скриптов

Для запуска Kotlin скриптов не нужно устанавливать Android Studio. Достаточно:

  1. Установить Kotlin компилятор (или SDKMAN).
  2. Создать файл с расширением .kts.
  3. Запустить командой: kotlinc -script script.kts

Готово. Теперь напишем первый реально полезный скрипт.

Пример 1: Массовое переименование файлов

Представьте: у вас есть папка с фотографиями IMG_001.jpg, IMG_002.jpg ... IMG_100.jpg. Нужно переименовать их в holiday_01.jpg, holiday_02.jpg .... Руками — 10 минут. Скриптом — 2 секунды.

import java.io.File

fun main() {
    val folder = File("/path/to/photos")
    val files = folder.listFiles()?.filter { it.extension == "jpg" } ?: return

    files.sorted().forEachIndexed { index, file ->
        val newName = "holiday_${index.toString().padStart(2, '0')}.jpg"
        val newFile = File(folder, newName)
        file.renameTo(newFile)
        println("Renamed: ${file.name} -> $newName")
    }
}

// Запуск: kotlinc -script rename.kts

Этот Kotlin пример кода делает три вещи: фильтрует только JPG-файлы, сортирует по имени (чтобы не потерять порядок), и переименовывает с нумерацией. Обратите внимание на padStart — элегантная фича Kotlin для форматирования чисел.

Пример 2: HTTP-запрос и парсинг JSON

Часто нужно автоматизировать сбор данных с веб-API. Допустим, мы получаем список пользователей и сохраняем их в CSV. В Kotlin для автоматизации это делается в несколько строк с помощью библиотеки ktor-client (или старого доброго java.net.HttpURLConnection).

Но для скрипта проще подключить внешнюю библиотеку через @file:DependsOn:

@file:DependsOn("com.google.code.gson:gson:2.10.1")
@file:DependsOn("io.ktor:ktor-client-core:2.3.7")
@file:DependsOn("io.ktor:ktor-client-java:2.3.7")

import io.ktor.client.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import java.io.File

data class User(val id: Int, val name: String, val email: String)

suspend fun main() {
    val client = HttpClient()
    val response: String = client.get("https://jsonplaceholder.typicode.com/users").bodyAsText()
    client.close()

    val gson = Gson()
    val userListType = object : TypeToken<List<User>>() {}.type
    val users: List<User> = gson.fromJson(response, userListType)

    val csvLines = users.joinToString("\n") { "${it.id},${it.name},${it.email}" }
    File("users.csv").writeText("id,name,email\n$csvLines")
    println("CSV файл создан: users.csv")
}

// Запуск: kotlinc -script http.kts

Этот скрипт делает HTTP GET-запрос, десериализует JSON в объекты Kotlin и пишет CSV. Kotlin парсинг данных с Gson — классика. А Ktor даёт асинхронность без лишнего шума.

Пример 3: Запуск shell-команд и мониторинг

Бывает нужно запускать системные утилиты, парсить их вывод. Например, проверить свободное место на диске и отправить уведомление, если меньше 10%. Kotlin shell команды запускаются через ProcessBuilder.

import java.io.File

fun main() {
    val command = "df -h / | tail -1"
    val process = ProcessBuilder("bash", "-c", command)
        .redirectErrorStream(true)
        .start()

    val output = process.inputStream.bufferedReader().readText()
    val parts = output.split(Regex("\\s+"))

    if (parts.size > 4) {
        val usedPercent = parts[4].replace("%", "").toIntOrNull() ?: 0
        println("Использовано: $usedPercent%")

        if (usedPercent > 90) {
            println("⚠️ Внимание! Диск почти полон.")
            // Здесь можно отправить email или Telegram-уведомление
        } else {
            println("✅ Места достаточно.")
        }
    }
}

// Запуск: kotlinc -script disk_check.kts

Обратите внимание: мы используем bash -c, чтобы передать сложную команду с пайпами. Результат парсим вручную — для быстрых скриптов этого достаточно. При необходимости можно подключить Regex.

Пример 4: Работа с Excel (без боли)

Офисные работники часто имеют дело с Excel. В Kotlin работа с файлами Excel возможна через библиотеку Apache POI. Подключаем её через Maven-зависимость:

@file:Dep                

Блоги

Рекомендаций по книгам