Назад к вопросам
Middle
269
questionbank

Как работать с файлами и потоками ввода-вывода (I/O) в Kotlin?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

В Kotlin стандартная библиотека предоставляет удобные расширения для работы с I/O, упрощая взаимодействие с java.io.

Основные подходы и классы:

  • Чтение из файла:

    • File.readBytes(): Читает содержимое файла в массив байт.
    • File.readText(): Читает содержимое файла как строку (с учетом кодировки).
    • File.forEachLine { ... }: Обрабатывает каждую строку файла.
    • File.bufferedReader(): Создает BufferedReader для построчного чтения.
    • File.inputStream(): Создает InputStream для чтения байтов.
  • Запись в файл:

    • File.writeBytes(bytes): Записывает массив байт в файл.
    • File.writeText(text, append): Записывает строку в файл. append = true для добавления в конец.
    • File.printWriter(): Создает PrintWriter для удобной записи форматированного текста.
    • File.outputStream(): Создает OutputStream для записи байтов.
  • Работа с потоками:

    • InputStream.bufferedReader(): Обертывает InputStream в BufferedReader.
    • OutputStream.printWriter(): Обертывает OutputStream в PrintWriter.
    • Функции расширения типа copyTo(outputStream) для копирования содержимого потоков.
  • Обработка ресурсов (closures):

    • Функции расширения use { ... } для автоматического закрытия потоков и ридеров/врайтеров, даже в случае исключений.
import java.io.File

fun main() {
    val file = File("my_file.txt")

    // Запись в файл
    file.writeText("Привет, Kotlin I/O!")
    file.appendText("\nПродолжение строки.")

    // Чтение из файла построчно
    file.forEachLine { line ->
        println(line)
    }

    // Чтение всего файла как строки
    val content = file.readText()
    println("\nВесь контент файла:")
    println(content)

    // Использование bufferedReader с use
    file.bufferedReader().use { reader ->
        reader.lines().forEach(::println) // Чтение через Java Stream API
    }

    // Копирование файла
    val newFile = File("my_file_copy.txt")
    file.inputStream().use { input ->
        newFile.outputStream().use { output ->
            input.copyTo(output) // Удобное копирование потоков
        }
    }
}

Таблица сравнения некоторых методов:

Метод Назначение Тип данных Построчный/Целиком Примечание
readBytes() Чтение в байты ByteArray Целиком Подходит для бинарных данных
readText() Чтение как строку String Целиком Удобно для текстовых файлов
forEachLine { } Обработка каждой строки String Построчный Идеально для больших текстовых файлов
bufferedReader() Создание буферизированного ридера N/A Потоковый Гибкий контроль, требует use
writeBytes() Запись байтов ByteArray Целиком Подходит для бинарных данных
writeText() Запись строки String Целиком/Добавление Удобно для текстовых файлов
printWriter() Создание врайтера с форматированием N/A Потоковый Удобно для форматированного вывода, требует use

Использование use { ... } является ключевым для безопасной работы с I/O в Kotlin, гарантируя освобождение ресурсов. Kotlin расширяет существующие Java классы (File, InputStream, OutputStream и т.д.) удобными функциями.