Sobes.tech
Middle

Kako raditi sa fajlovima i tokovima ulaza/izlaza (I/O) u Kotlinu?

sobes.tech АИ

Одговор од АИ

Standardna biblioteka Kotlin-a pruža udobna proširenja za rad sa I/O, pojednostavljujući interakciju sa java.io.

Glavni pristupi i klase:

  • Čitanje iz fajla:

    • File.readBytes(): Čita sadržaj fajla u niz bajtova.
    • File.readText(): Čita sadržaj fajla kao string (uzimajući u obzir kodiranje).
    • File.forEachLine { ... }: Obradjuje svaki red fajla.
    • File.bufferedReader(): Kreira BufferedReader za linijsko čitanje.
    • File.inputStream(): Kreira InputStream za čitanje bajtova.
  • Upis u fajl:

    • File.writeBytes(bytes): Upisuje niz bajtova u fajl.
    • File.writeText(text, append): Upisuje string u fajl. append = true dodaje na kraj.
    • File.printWriter(): Kreira PrintWriter za lako formatirano pisanje.
    • File.outputStream(): Kreira OutputStream za upis bajtova.
  • Rad sa tokovima:

    • InputStream.bufferedReader(): Omotava InputStream u BufferedReader.
    • OutputStream.printWriter(): Omotava OutputStream u PrintWriter.
    • Ekstenzije copyTo(outputStream) za kopiranje sadržaja tokova.
  • Upravljanje resursima (closures):

    • Ekstenzije use { ... } obezbeđuju automatsko zatvaranje tokova i čitača/pisaca, čak i u slučaju izuzetaka.
import java.io.File

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

    // Upis u fajl
    file.writeText("Zdravo, Kotlin I/O!")
    file.appendText("\nNastavak reda.")

    // Čitanje red po red
    file.forEachLine { line ->
        println(line)
    }

    // Čitanje celog fajla kao tekst
    val content = file.readText()
    println("\nCelokupni sadržaj fajla:")
    println(content)

    // Korišćenje bufferedReader sa `use`
    file.bufferedReader().use { reader ->
        reader.lines().forEach(::println) // Čitanje preko Java Stream API
    }

    // Kopiranje fajla
    val newFile = File("my_file_copy.txt")
    file.inputStream().use { input ->
        newFile.outputStream().use { output ->
            input.copyTo(output) // Udobno kopiranje tokova
        }
    }
}

Tabela poređenja nekih metoda:

Metod Svrha Tip podataka Red po red/komplet Napomena
readBytes() Čitanje u bajtove ByteArray Kompletno Pogodno za binarne podatke
readText() Čitanje kao string String Kompletno Pogodno za tekstualne fajlove
forEachLine { } Obrada svakog reda String Red po red Idealan za velike tekstualne fajlove
bufferedReader() Kreiranje bufferovanog čitača N/A Tokovski Fleksibilna kontrola, zahteva use
writeBytes() Upis bajtova ByteArray Kompletno Pogodno za binarne podatke
writeText() Upis stringa String Kompletno/dodavanje Udobno za tekstualne fajlove
printWriter() Kreiranje formatiranog pisca N/A Tokovski Udobno za formatirani izlaz, zahteva use

Korišćenje use { ... } je ključno za sigurnu rad sa I/O u Kotlinu, garantujući oslobađanje resursa. Kotlin proširuje postojeće Java klase (File, InputStream, OutputStream itd.) sa udobnim funkcijama.