Sobes.tech
Middle

Jak pracovat se soubory a vstupně/výstupními (I/O) toky v Kotlinu?

sobes.tech AI

Odpověď od AI

Standardní knihovna Kotlinu poskytuje pohodlné rozšíření pro práci s I/O, zjednodušující interakci s java.io.

Hlavní přístupy a třídy:

  • Čtení ze souboru:

    • File.readBytes(): Čte obsah souboru do pole bajtů.
    • File.readText(): Čte obsah souboru jako řetězec (s ohledem na kódování).
    • File.forEachLine { ... }: Zpracovává každý řádek souboru.
    • File.bufferedReader(): Vytváří BufferedReader pro řádkové čtení.
    • File.inputStream(): Vytváří InputStream pro čtení bajtů.
  • Zápis do souboru:

    • File.writeBytes(bytes): Zapíše pole bajtů do souboru.
    • File.writeText(text, append): Zapíše řetězec do souboru. append = true přidá na konec.
    • File.printWriter(): Vytváří PrintWriter pro pohodlný zápis formátovaného textu.
    • File.outputStream(): Vytváří OutputStream pro zápis bajtů.
  • Práce s proudy:

    • InputStream.bufferedReader(): Obaluje InputStream do BufferedReader.
    • OutputStream.printWriter(): Obaluje OutputStream do PrintWriter.
    • Rozšíření copyTo(outputStream) pro kopírování obsahu proudů.
  • Správa zdrojů (closures):

    • Rozšíření use { ... } zajišťují automatické uzavření proudů a čteček/zapisovačů, i při výjimkách.
import java.io.File

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

    // Zápis do souboru
    file.writeText("Ahoj, Kotlin I/O!")
    file.appendText("\nPokračování řádku.")

    // Čtení po řádcích
    file.forEachLine { line ->
        println(line)
    }

    // Čtení celého souboru jako text
    val content = file.readText()
    println("\nCelý obsah souboru:")
    println(content)

    // Použití bufferedReader s `use`
    file.bufferedReader().use { reader ->
        reader.lines().forEach(::println) // Čtení přes Java Stream API
    }

    // Kopírování souboru
    val newFile = File("my_file_copy.txt")
    file.inputStream().use { input ->
        newFile.outputStream().use { output ->
            input.copyTo(output) // Pohodlné kopírování proudů
        }
    }
}

Porovnání některých metod:

Metoda Účel Datový typ Řádek-řádek/kompletní Poznámka
readBytes() Čtení do bajtů ByteArray Kompletní Vhodné pro binární data
readText() Čtení jako řetězec String Kompletní Vhodné pro textové soubory
forEachLine { } Zpracování každého řádku String Řádek-řádek Ideální pro velké textové soubory
bufferedReader() Vytvoření bufferovaného čteče N/A Proudové Flexibilní kontrola, vyžaduje use
writeBytes() Zápis bajtů ByteArray Kompletní Vhodné pro binární data
writeText() Zápis řetězce String Kompletní/přidání Pohodlné pro textové soubory
printWriter() Vytvoření formátovaného zápisovače N/A Proudové Pohodlné pro formátovaný výstup, vyžaduje use

Použití use { ... } je klíčové pro bezpečnou práci s I/O v Kotlinu, zajišťující uvolnění zdrojů. Kotlin rozšiřuje stávající třídy Java (File, InputStream, OutputStream atd.) o pohodlné funkce.