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 unBufferedReaderper la lettura riga per riga.File.inputStream(): Crea unInputStreamper 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 = trueper aggiungere alla fine.File.printWriter(): Crea unPrintWriterper scrittura di testo formattato.File.outputStream(): Crea unOutputStreamper scrivere byte.
-
Lavoro con gli stream:
InputStream.bufferedReader(): Avvolge unInputStreamin unBufferedReader.OutputStream.printWriter(): Avvolge unOutputStreamin unPrintWriter.- 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.
- Funzioni di estensione
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.