Sobes.tech
Middle

Ako pracovať so súbormi a tokmi vstupu/výstupu (I/O) v Kotlin?

sobes.tech AI

Odpoveď od AI

Štandardná knižnica Kotlinu poskytuje pohodlné rozšírenia pre prácu s I/O, zjednodušujúc interakciu s java.io.

Hlavné prístupy a triedy:

  • Čítanie zo súboru:

    • File.readBytes(): Číta obsah súboru do poľa bajtov.
    • File.readText(): Číta obsah súboru ako reťazec (s prihliadnutím na kódovanie).
    • File.forEachLine { ... }: Spracováva každý riadok súboru.
    • File.bufferedReader(): Vytvára BufferedReader na riadkové čítanie.
    • File.inputStream(): Vytvára InputStream na čítanie bajtov.
  • Zápis do súboru:

    • File.writeBytes(bytes): Zapíše pole bajtov do súboru.
    • File.writeText(text, append): Zapíše reťazec do súboru. append = true pridáva na koniec.
    • File.printWriter(): Vytvára PrintWriter na pohodlný zápis formátovaného textu.
    • File.outputStream(): Vytvára OutputStream na zápis bajtov.
  • Práca s prúdmi:

    • InputStream.bufferedReader(): Obaluje InputStream do BufferedReader.
    • OutputStream.printWriter(): Obaluje OutputStream do PrintWriter.
    • Rozšírenia copyTo(outputStream) na kopírovanie obsahu prúdov.
  • Správa zdrojov (closures):

    • Rozšírenia use { ... } zabezpečujú automatické zatvorenie prúdov a čítačov/pisateľov, aj pri výnimkách.
import java.io.File

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

    // Zápis do súboru
    file.writeText("Ahoj, Kotlin I/O!")
    file.appendText("\nPokračovanie.")

    // Čítanie po riadkoch
    file.forEachLine { line ->
        println(line)
    }

    // Čítanie celého súboru ako text
    val content = file.readText()
    println("\nCelý obsah súboru:")
    println(content)

    // Použitie bufferedReader s `use`
    file.bufferedReader().use { reader ->
        reader.lines().forEach(::println) // Čítanie cez Java Stream API
    }

    // Kopírovanie súboru
    val newFile = File("my_file_copy.txt")
    file.inputStream().use { input ->
        newFile.outputStream().use { output ->
            input.copyTo(output) // Pohodlné kopírovanie prúdov
        }
    }
}

Porovnanie niektorých metód:

Metóda Účel Typ údajov Riadok po riadku/kompletné Poznámka
readBytes() Čítanie do bajtov ByteArray Kompletné Vhodné pre binárne dáta
readText() Čítanie ako reťazec String Kompletné Vhodné pre textové súbory
forEachLine { } Spracovanie každého riadku String Riadok po riadku Ideálne pre veľké textové súbory
bufferedReader() Vytvorenie bufferovaného čítača N/A Prúdové Flexibilná kontrola, vyžaduje use
writeBytes() Zápis bajtov ByteArray Kompletné Vhodné pre binárne dáta
writeText() Zápis reťazca String Kompletné/doplnenie Pohodlné pre textové súbory
printWriter() Vytvorenie formátovaného pisateľa N/A Prúdové Pohodlné pre formátovaný výstup, vyžaduje use

Použitie use { ... } je kľúčové pre bezpečnú prácu s I/O v Kotlin, zabezpečuje uvoľnenie zdrojov. Kotlin rozširuje existujúce Java triedy (File, InputStream, OutputStream a pod.) o pohodlné funkcie.