Leggere da un file in Kotlin

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.