Sobes.tech
Middle

Чӣ гуна кор кардан бо файлҳо ва ҷараёнҳои воридот/баромад (I/O) дар Kotlin?

sobes.tech AI

Ҷавоб аз 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 и др.) с удобни функции.