Простые приложения на Kotlin
Простые приложения на Kotlin
Kotlin — это современный язык программирования, разработанный компанией JetBrains. Он полностью совместим с экосистемой Java, но предлагает более лаконичный синтаксис, безопасную работу с данными и продвинутые функции для работы с коллекциями. Язык особенно удобен для создания консольных утилит, скриптов автоматизации и простых приложений с графическим интерфейсом.
В этой главе рассматриваются примеры простых приложений, демонстрирующие базовые возможности языка — работу со строками, файлами, сетью, сериализацией данных и системными ресурсами. Каждый пример сопровождается разбором ключевых конструкций кода.
Как запускать примеры из главы
- Скопируйте код в файл
.ktс функциейfun main(). - IntelliJ IDEA / Android Studio: откройте файл → Run у
main. - CLI:
kotlin имя.kt(Kotlin 2.x) илиkotlinc имя.kt -include-runtime -d app.jar && java -jar app.jar. - Нужно: JDK 17+.
Генератор паролей
Генератор паролей демонстрирует работу со строками, массивами символов и генерацией случайных значений. Приложение создает пароль заданной длины, используя набор допустимых символов.
Как запустить
- Файл:
Main.kt(или имя по смыслу раздела) сfun main()из примера. - Команда: Run в IDE или
kotlin Main.kt. - Результат: вывод
printlnв консоли (см. конец примера).
Код программы
Код ITЗагрузка примера кода…
Разбор кода
- SecureRandom: Класс из пакета
java.securityобеспечивает криптографически стойкую генерацию случайных чисел. Это предпочтительнее использования классаRandomдля создания паролей. - Коллекция символов: Строка
charsсодержит все допустимые символы для пароля. - Диапазон и маппинг: Оператор
(1..length)создает диапазон целых чисел от 1 до заданной длины. Методmapприменяет лямбда-выражение к каждому элементу диапазона, выбирая случайный символ из строкиchars. - joinToString: Метод объединяет список символов в одну строку без разделителей.
- Интерполяция строк: Конструкция
$passwordпозволяет вставлять значение переменной прямо в строку вывода.
Сортировщик текстового файла
Эта утилита читает текст из файла, сортирует слова по алфавиту и записывает результат в новый файл. Пример иллюстрирует работу с файловым вводом/выводом и коллекциями.
Как запустить
- Файл:
Main.kt(или имя по смыслу раздела) сfun main()из примера. - Команда: Run в IDE или
kotlin Main.kt. - Результат: вывод
printlnв консоли (см. конец примера).
Код программы
Код ITЗагрузка примера кода…
Разбор кода
- Чтение файла: Метод
readText()загружает всё содержимое файла в память как строку. - Разделение текста — Регулярное выражение
\\s+разделяет текст по пробельным символам (пробелы, табы, переносы строк). Фильтрацияfilter { it.isNotEmpty() }удаляет пустые элементы. - Сортировка: Метод
Collections.sort()сортирует список слов в лексикографическом порядке. - Запись файла: Метод
writeText()записывает отсортированный список слов в новый файл, разделяя их переносами строк.
Консольный калькулятор
Простой калькулятор выполняет арифметические операции (+, -, *, /) над двумя числами, введенными пользователем. Пример показывает обработку ввода, условные операторы и исключительные ситуации.
Как запустить
- Файл:
Main.kt(или имя по смыслу раздела) сfun main()из примера. - Команда: Run в IDE или
kotlin Main.kt. - Результат: вывод
printlnв консоли (см. конец примера).
Код программы
Код ITЗагрузка примера кода…
Разбор кода
- when: Конструкция
whenработает как расширенный операторswitch, позволяя сопоставлять значения оператора с соответствующими действиями. - Обработка ошибок: Метод
toDoubleOrNull()возвращаетnull, если строка не является числом. Оператор Elvis (?:) используется для обработки таких случаев и завершения выполнения функции. - Проверка деления: В случае деления проверяется, что делитель не равен нулю. Если условие нарушено, функция возвращает
null.
Трекер задач в JSON
Приложение управляет списком задач, сохраняя их в формате JSON. Пример демонстрирует использование библиотек для сериализации и десериализации данных, а также работу с файловой системой. Для работы потребуется библиотека kotlinx.serialization.
Структура данных
import kotlinx.serialization.Serializable
@Serializable
data class Task(
val id: Int,
val title: String,
val isCompleted: Boolean
)
Как запустить
- Файл:
Main.kt(или имя по смыслу раздела) сfun main()из примера. - Команда: Run в IDE или
kotlin Main.kt. - Результат: вывод
printlnв консоли (см. конец примера).
Код программы
Код ITЗагрузка примера кода…
Разбор кода
- Аннотация @Serializable: Указывает классу, что его экземпляры могут быть преобразованы в формат JSON.
- Json.encodeToString / decodeFromString: Методы библиотеки
kotlinx.serializationпреобразуют объекты в строки JSON и обратно. - Работа с файлами: Функции
loadTasksиsaveTasksобеспечивают сохранение состояния приложения между запусками. - Генерация ID: Метод
maxOfOrNullнаходит максимальный ID среди существующих задач, чтобы присвоить новому уникальный идентификатор.
Простой HTTP-сервер и клиент
Kotlin позволяет создавать простые сетевые приложения с использованием встроенных классов HttpURLConnection или сторонних библиотек. Ниже приведен пример сервера на основе стандартной библиотеки Java и клиента, отправляющего запрос.
Сервер
Код ITЗагрузка примера кода…
Клиент
Код ITЗагрузка примера кода…
Разбор кода
- ServerSocket: Создает серверный сокет, который слушает входящие соединения на указанном порту.
- Socket: Представляет соединение между клиентом и сервером.
- HttpURLConnection: Класс для отправки HTTP-запросов и получения ответов.
- Потоки ввода/вывода:
BufferedReaderиPrintWriterиспользуются для чтения и записи текстовых данных через сеть.
Отправитель HTTP-запросов
Утилита для отправки произвольных HTTP-запросов с возможностью указания метода, заголовков и тела запроса.
Как запустить
- Файл:
Main.kt(или имя по смыслу раздела) сfun main()из примера. - Команда: Run в IDE или
kotlin Main.kt. - Результат: вывод
printlnв консоли (см. конец примера).
Код программы
Код ITЗагрузка примера кода…
Разбор кода
- Настройка заголовков: Цикл
forEachустанавливает пользовательские заголовки в запросе. - Отправка тела: При использовании методов POST или PUT тело запроса записывается в поток вывода.
- Чтение ответа: Данные считываются из потока ввода и собираются в строку для отображения.
Утилита для сканирования директорий
Программа выводит список всех файлов и поддиректорий в указанной папке рекурсивно.
Как запустить
- Файл:
Main.kt(или имя по смыслу раздела) сfun main()из примера. - Команда: Run в IDE или
kotlin Main.kt. - Результат: вывод
printlnв консоли (см. конец примера).
Код программы
Код ITЗагрузка примера кода…
Разбор кода
- Рекурсия: Функция вызывает сама себя для каждой поддиректории, увеличивая уровень отступа.
- File.listFiles(): Возвращает массив файлов в текущей директории.
- Отступы: Строка
" ".repeat(indent)создает визуальный отступ для отображения структуры дерева.
Скрипт для создания резервного копирования файлов
Скрипт копирует файлы из одной директории в другую, создавая временную метку в имени папки назначения.
Как запустить
- Файл:
Main.kt(или имя по смыслу раздела) сfun main()из примера. - Команда: Run в IDE или
kotlin Main.kt. - Результат: вывод
printlnв консоли (см. конец примера).
Код программы
Код ITЗагрузка примера кода…
Разбор кода
- Дата и время: Класс
LocalDateTimeи форматтерDateTimeFormatterгенерируют уникальное имя для папки бэкапа. - Копирование файлов: Метод
copyToкопирует файл в новую директорию с возможностью перезаписи. - Создание директории: Метод
mkdirs()создает всю цепочку директорий, если они отсутствуют.
Мониторинг дискового пространства
Утилита отображает информацию о свободном и занятом месте на дисках системы.
Как запустить
- Файл:
Main.kt(или имя по смыслу раздела) сfun main()из примера. - Команда: Run в IDE или
kotlin Main.kt. - Результат: вывод
printlnв консоли (см. конец примера).
Код программы
Код ITЗагрузка примера кода…
Разбор кода
- Свойства объекта File — Поля
totalSpace,freeSpace,usableSpaceсодержат информацию о пространстве диска в байтах. - Конвертация единиц: Деление на
1024 * 1024 * 1024переводит байты в гигабайты. - Форматирование вывода: Метод
formatпозволяет вывести процент занятости с двумя знаками после запятой.
Парсер URL и проверка доступности ресурса
Программа анализирует URL, извлекает компоненты (протокол, хост, путь) и проверяет доступность ресурса.
Как запустить
- Файл:
Main.kt(или имя по смыслу раздела) сfun main()из примера. - Команда: Run в IDE или
kotlin Main.kt. - Результат: вывод
printlnв консоли (см. конец примера).
Код программы
Код ITЗагрузка примера кода…
Разбор кода
- Класс URL: Автоматически разбирает строку URL на компоненты.
- HEAD запрос: Используется для проверки доступности ресурса без загрузки всего контента.
- Обработка исключений: Блок
try-catchперехватывает ошибки сети или неверного формата URL.
Конвертер форматов дат
Утилита преобразует строковое представление даты в различные форматы.
Как запустить
- Файл:
Main.kt(или имя по смыслу раздела) сfun main()из примера. - Команда: Run в IDE или
kotlin Main.kt. - Результат: вывод
printlnв консоли (см. конец примера).
Код программы
Код ITЗагрузка примера кода…
Разбор кода
- LocalDate: Класс для работы с датами без учета времени.
- DateTimeFormatter: Определяет шаблоны для парсинга и форматирования дат.
- Параметризация: Список выходных форматов позволяет гибко задавать нужные варианты представления даты.
Утилита для просмотра запущенных процессов
Программа выводит список активных процессов операционной системы с указанием их имен и идентификаторов.
Как запустить
- Файл:
Main.kt(или имя по смыслу раздела) сfun main()из примера. - Команда: Run в IDE или
kotlin Main.kt. - Результат: вывод
printlnв консоли (см. конец примера).
Код программы
Код ITЗагрузка примера кода…
Разбор кода
- ProcessBuilder: Запускает внешнюю команду операционной системы.
- Определение ОС: Логика выбора команды зависит от названия операционной системы.
- Чтение вывода: Вывод процесса считывается построчно и выводится в консоль.
Характерный пример для Kotlin
Одной из ключевых особенностей Kotlin является работа с nullable типами и безопасность операций. Приведенный пример демонстрирует использование оператора ?. (safe call), elvis-оператора ?: и функции let для безопасной работы с потенциально пустыми значениями.
Как запустить
- Файл:
Main.kt(или имя по смыслу раздела) сfun main()из примера. - Команда: Run в IDE или
kotlin Main.kt. - Результат: вывод
printlnв консоли (см. конец примера).
Код программы
Код ITЗагрузка примера кода…
Разбор кода
- Safe Call (
?.): Вызывает метод только если объект не равенnull. - Elvis Operator (
?:): Возвращает альтернативное значение, если левая часть равнаnull. - Функция
let: Позволяет выполнить блок кода с объектом, передавая его как параметр. - Блоки
run: Выполняются при отсутствии объекта или при необходимости выполнить действие по умолчанию.
Этот подход делает код более читаемым и предотвращает возникновение NullPointerException, что является одним из главных преимуществ Kotlin перед Java.
Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.