Работа с файловой системой в Kotlin: полное руководство для начинающих

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

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

Начать курс

Введение в работу с файловой системой в Kotlin

Работа с файловой системой — одна из базовых задач, с которой сталкивается каждый разработчик. Независимо от того, пишете вы консольное приложение, веб-сервис или мобильное приложение под Android, умение читать, записывать и управлять файлами является обязательным навыком. В этой статье мы подробно разберем, как работать с файловой системой в Kotlin, используя как стандартные средства Java, так и современные возможности языка.

Kotlin — это современный, лаконичный и безопасный язык программирования, который полностью совместим с Java. Это означает, что вы можете использовать все возможности java.io и java.nio.file, но при этом писать код гораздо короче и выразительнее. Статья рассчитана на начинающих разработчиков, которые уже знакомы с основами синтаксиса Kotlin.

Основные классы и методы для работы с файлами

Прежде чем перейти к практике, давайте познакомимся с ключевыми классами, которые понадобятся для работы с файловой системой в Kotlin:

  • java.io.File — основной класс для представления файлов и директорий.
  • java.nio.file.Path — современный интерфейс для работы с путями.
  • java.nio.file.Files — утилитный класс с множеством статических методов.
  • java.io.BufferedReader и java.io.BufferedWriter — для построчного чтения и записи.

В Kotlin также есть собственные удобные расширения для класса File, которые делают код ещё проще. Например, функции readText(), writeText(), appendText() и другие.

Создание файлов и директорий

Начнем с самого простого — создания файла. В Kotlin это делается в одну строку:

import java.io.File

fun main() {
    val file = File("example.txt")
    file.createNewFile() // создает файл, если он не существует
    println("Файл создан: ${file.absolutePath}")
}

Обратите внимание: createNewFile() возвращает Boolean — true, если файл был создан, и false, если он уже существует. Для создания директорий используется метод mkdir() или mkdirs() (создает все недостающие родительские папки):

fun main() {
    val dir = File("myFolder/subFolder")
    if (dir.mkdirs()) {
        println("Директория создана: ${dir.absolutePath}")
    } else {
        println("Не удалось создать директорию")
    }
}

Чтение данных из файла

Существует несколько способов прочитать файл в Kotlin. Рассмотрим самые популярные.

Чтение всего файла целиком

Если файл небольшой, удобно прочитать его содержимое в одну строку или список строк:

fun main() {
    val file = File("readme.txt")
    
    // Чтение всего текста в одну строку
    val text: String = file.readText()
    println("Содержимое файла:\n$text")
    
    // Чтение построчно
    val lines: List<String> = file.readLines()
    lines.forEach { println("Строка: $it") }
}

Метод readText() возвращает строку, а readLines() — список строк. Оба метода автоматически закрывают файл после чтения, что безопасно и удобно.

Построчное чтение с буферизацией

Для больших файлов лучше использовать BufferedReader, чтобы не загружать весь файл в память:

fun main() {
    val file = File("large_file.txt")
    file.bufferedReader().use { reader ->
        var line: String?
        while (reader.readLine().also { line = it } != null) {
            println("Читаем: $line")
        }
    }
}

Конструкция .use { } гарантирует, что ресурс будет закрыт после завершения работы блока, даже если возникнет исключение.

Запись данных в файл

Запись в файл в Kotlin также интуитивно понятна. Рассмотрим основные варианты.

Перезапись файла

Чтобы записать текст в файл, заменив его содержимое, используйте writeText():

fun main() {
    val file = File("output.txt")
    file.writeText("Привет, мир!\nЭто вторая строка.")
    println("Файл записан.")
}

Если файл не существует, он будет создан. Если существует — его содержимое будет полностью заменено.

Добавление в конец файла

Чтобы дописать данные в конец существующего файла, используйте appendText():

fun main() {
    val file = File("log.txt")
    file.appendText("Новая запись в лог: ${System.currentTimeMillis()}\n")
    println("Данные добавлены.")
}

Запись списка строк

Иногда удобно записать сразу массив строк, используя writeLines() или printWriter():

fun main() {
    val file = File("lines.txt")
    val lines = listOf("Первая строка", "Вторая строка", "Третья строка")
    file.writeText(lines.joinToString("\n")) // простой способ
    // или через PrintWriter
    file.printWriter().use { writer ->
        lines.forEach { writer.println(it) }
    }
}

Управление файлами: копирование, перемещение, удаление

Помимо чтения и записи, часто требуется выполнять операции с файлами как с объектами: копировать, переименовывать или удалять их.

Копирование файла

Самый простой способ скопировать файл — использовать метод copyTo():

fun main() {
    val source = File("source.txt")
    val target = File("target.txt")
    source.copyTo(target, overwrite = true)
    println("Файл скопирован.")
}

Параметр overwrite = true разрешает перезапись, если целевой файл уже существует.

Перемещение и переименование

Метод renameTo() позволяет переименовать или переместить файл:

fun main() {
    val file = File("old_name.txt")
    val newFile = File("new_name.txt")
    if (file.renameTo(newFile)) {
        println("Файл переименован.")
    } else {
        println                

Блоги

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