Автоматизация на 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. Достаточно:
- Установить Kotlin компилятор (или SDKMAN).
- Создать файл с расширением
.kts. - Запустить командой:
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