1. Panoramica
In questo rapido tutorial, impareremo i vari modi di leggere un file in Kotlin.
Tratteremo entrambi i casi d'uso di lettura dell'intero file come una stringa, nonché di lettura in un elenco di singole righe. Ottenendolo anche da un percorso assoluto completo o da una risorsa del progetto.
2. Leggere un file
Creiamo prima un file di input che verrà letto da Kotlin. Creiamo un file chiamato Kotlin.in e lo posizioniamo in una directory a cui è possibile accedere tramite il nostro codice.
Il contenuto del file potrebbe essere:
Hello to Kotlin. It's: 1. Concise 2. Safe 3. Interoperable 4. Tool-friendly
Ora diamo un'occhiata ai diversi modi in cui possiamo leggere questo file. Dovremmo passare il percorso completo del file creato sopra come input per i metodi iniziali e il percorso relativo nelle nostre risorse per gli ultimi due.
2.1. forEachLine
Legge un file riga per riga utilizzando il set di caratteri specificato (l'impostazione predefinita è UTF-8) e chiama un'azione per ciascuna riga:
fun readFileLineByLineUsingForEachLine(fileName: String) = File(fileName).forEachLine { println(it) }
2.2. useLines
Chiama un determinato blocco di callback, dandogli una sequenza di tutte le righe in un file.
Una volta completata l'elaborazione, il file viene chiuso:
fun readFileAsLinesUsingUseLines(fileName: String): List = File(fileName).useLines { it.toList() }
2.3. bufferedReader
Restituisce un nuovo BufferedReader per leggere il contenuto del file.
Una volta che abbiamo un BufferedReader , possiamo leggere tutte le righe in esso:
fun readFileAsLinesUsingBufferedReader(fileName: String): List = File(fileName).bufferedReader().readLines()
2.4. readLines
Legge direttamente il contenuto del file come un elenco di righe:
fun readFileAsLinesUsingReadLines(fileName: String): List = File(fileName).readLines()
Questo metodo non è consigliato per file di grandi dimensioni.
2.5. inputStream
Costruisce un nuovo FileInputStream per il file e lo restituisce come risultato.
Una volta ottenuto il flusso di input, possiamo convertirlo in byte e quindi in una stringa completa :
fun readFileAsTextUsingInputStream(fileName: String) = File(fileName).inputStream().readBytes().toString(Charsets.UTF_8)
2.6. readText
Legge l'intero contenuto del file come una stringa del set di caratteri specificato (l'impostazione predefinita è UTF-8):
fun readFileDirectlyAsText(fileName: String): String = File(fileName).readText(Charsets.UTF_8)
Questo metodo non è consigliato per file di grandi dimensioni e ha una limitazione interna di 2 GB di dimensione del file.
2.7. getResource
Trova una risorsa con il nome specificato e restituisce un oggetto URL :
fun readFileUsingGetResource(fileName: String) = this::class.java.getResource(fileName).readText(Charsets.UTF_8)
Se trova la risorsa, restituirà un URL , che può essere elaborato chiamando il metodo readText come mostrato prima. Se non riesce a trovare la risorsa, restituisce null . Quando si utilizza getResource , il fileName passato non è un nome di file assoluto ma un nome relativo alle risorse del nostro progetto.
2.8. getResourceAsStream
Trova una risorsa con il nome specificato e restituisce un'istanza InputStream :
fun readFileAsLinesUsingGetResourceAsStream(fileName: String) = this::class.java.getResourceAsStream(fileName).bufferedReader().readLines()
Se trova la risorsa, restituirà un InputStream , che può essere elaborato come mostrato prima, ad esempio ottenendo un BufferedReader . Se non riesce a trovare la risorsa, restituisce null . Quando si utilizza getResourceAsStream , il fileName passato non è un nome di file assoluto ma un nome relativo alle risorse del nostro progetto.
3. Conclusione
In questo articolo, abbiamo visto i vari modi di leggere un file in Kotlin. A seconda del caso d'uso, possiamo scegliere di leggere il file riga per riga o di leggerlo interamente come testo. Possiamo fare riferimento al file in modo assoluto o trovarlo tra le risorse.
Il codice sorgente di questo articolo è disponibile nel seguente repository GitHub.