Sobes.tech
Middle

Come lavorare con file e flussi di input/output (I/O) in Kotlin?

sobes.tech AI

Risposta dell'AI

La libreria standard di Kotlin fornisce estensioni pratiche per lavorare con I/O, semplificando l'interazione con java.io.

Approcci principali e classi:

  • Lettura da file:

    • File.readBytes(): Legge il contenuto del file in un array di byte.
    • File.readText(): Legge il contenuto del file come stringa (considerando la codifica).
    • File.forEachLine { ... }: Elabora ogni riga del file.
    • File.bufferedReader(): Crea un BufferedReader per la lettura riga per riga.
    • File.inputStream(): Crea un InputStream per leggere byte.
  • Scrittura su file:

    • File.writeBytes(bytes): Scrive un array di byte su un file.
    • File.writeText(text, append): Scrive una stringa su un file. append = true per aggiungere alla fine.
    • File.printWriter(): Crea un PrintWriter per scrittura di testo formattato.
    • File.outputStream(): Crea un OutputStream per scrivere byte.
  • Lavoro con gli stream:

    • InputStream.bufferedReader(): Avvolge un InputStream in un BufferedReader.
    • OutputStream.printWriter(): Avvolge un OutputStream in un PrintWriter.
    • Funzioni di estensione copyTo(outputStream) per copiare contenuto tra stream.
  • Gestione delle risorse (closures):

    • Funzioni di estensione use { ... } per chiudere automaticamente stream e reader/writer, anche in caso di eccezioni.
import java.io.File

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

    // Scrittura nel file
    file.writeText("Ciao, Kotlin I/O!")
    file.appendText("\nContinuazione della riga.")

    // Lettura riga per riga
    file.forEachLine { line ->
        println(line)
    }

    // Lettura di tutto il contenuto come testo
    val content = file.readText()
    println("\nContenuto completo del file:")
    println(content)

    // Uso di bufferedReader con use
    file.bufferedReader().use { reader ->
        reader.lines().forEach(::println) // Lettura tramite API Stream di Java
    }

    // Copia del file
    val newFile = File("my_file_copy.txt")
    file.inputStream().use { input ->
        newFile.outputStream().use { output ->
            input.copyTo(output) // Copia comoda degli stream
        }
    }
}

Tabella comparativa di alcuni metodi:

Metodo Scopo Tipo di dato Riga per riga / Tutto Nota
readBytes() Lettura in byte ByteArray Tutto Adatto per dati binari
readText() Lettura come testo String Tutto Pratico per file di testo
forEachLine { } Elaborazione di ogni riga String Riga per riga Ideale per grandi file di testo
bufferedReader() Creazione di un reader bufferizzato N/A Stream Controllo flessibile, richiede use
writeBytes() Scrittura di byte ByteArray Tutto Adatto per dati binari
writeText() Scrittura di testo String Tutto / aggiunta Pratico per file di testo
printWriter() Creazione di uno scrittore formattato N/A Stream Utile per output formattato, richiede use

L'uso di use { ... } è fondamentale per lavorare in modo sicuro con I/O in Kotlin, garantendo il rilascio delle risorse. Kotlin estende le classi Java esistenti (File, InputStream, OutputStream, ecc.) con funzioni utili.