Lecture à partir d'un fichier dans Kotlin

1. Vue d'ensemble

Dans ce rapide tutoriel, nous découvrirons les différentes manières de lire un fichier dans Kotlin.

Nous couvrirons les deux cas d'utilisation de la lecture du fichier entier sous forme de chaîne, ainsi que de sa lecture dans une liste de lignes individuelles. L'obtention également d'un chemin absolu complet ou d'une ressource de projet.

2. Lire un fichier

Créons d'abord un fichier d'entrée qui sera lu par Kotlin. Nous créons un fichier appelé Kotlin.in et le plaçons dans un répertoire accessible par notre code.

Le contenu du fichier peut être:

Hello to Kotlin. It's: 1. Concise 2. Safe 3. Interoperable 4. Tool-friendly

Voyons maintenant les différentes manières dont nous pouvons lire ce fichier. Nous devons passer le chemin complet du fichier créé ci-dessus comme entrée pour les méthodes initiales et le chemin relatif dans nos ressources pour les deux dernières.

2.1. forEachLine

Lit un fichier ligne par ligne en utilisant le jeu de caractères spécifié (la valeur par défaut est UTF-8) et appelle une action pour chaque ligne:

fun readFileLineByLineUsingForEachLine(fileName: String) = File(fileName).forEachLine { println(it) }

2.2. useLines

Appelle un rappel de bloc donné, en lui donnant une séquence de toutes les lignes d'un fichier.

Une fois le traitement terminé, le fichier est fermé:

fun readFileAsLinesUsingUseLines(fileName: String): List = File(fileName).useLines { it.toList() }

2.3. bufferedReader

Renvoie un nouveau BufferedReader pour lire le contenu du fichier.

Une fois que nous avons un BufferedReader , nous pouvons lire toutes les lignes qu'il contient:

fun readFileAsLinesUsingBufferedReader(fileName: String): List = File(fileName).bufferedReader().readLines()

2.4. readLines

Lit directement le contenu du fichier sous forme de liste de lignes:

fun readFileAsLinesUsingReadLines(fileName: String): List = File(fileName).readLines()

Cette méthode n'est pas recommandée pour les fichiers volumineux.

2.5. flux d'entrée

Construit un nouveau FileInputStream pour le fichier et le renvoie en conséquence.

Une fois que nous avons le flux d'entrée, nous pouvons le convertir en octets, puis en une chaîne complète :

fun readFileAsTextUsingInputStream(fileName: String) = File(fileName).inputStream().readBytes().toString(Charsets.UTF_8)

2.6. readText

Lit tout le contenu du fichier sous forme de chaîne du jeu de caractères spécifié (la valeur par défaut est UTF-8):

fun readFileDirectlyAsText(fileName: String): String = File(fileName).readText(Charsets.UTF_8)

Cette méthode n'est pas recommandée pour les fichiers volumineux et a une limite interne de taille de fichier de 2 Go.

2.7. getResource

Recherche une ressource avec le nom donné et renvoie un objet URL :

fun readFileUsingGetResource(fileName: String) = this::class.java.getResource(fileName).readText(Charsets.UTF_8)

S'il trouve la ressource, il renverra une URL , qui peut être traitée en appelant la méthode readText comme indiqué précédemment. S'il ne trouve pas la ressource, il renvoie null . Lorsque vous utilisez getResource , le passé dans fileName est pas un nom de fichier absolu , mais un nom par rapport à nos ressources du projet.

2.8. getResourceAsStream

Recherche une ressource avec le nom donné et renvoie une instance InputStream :

fun readFileAsLinesUsingGetResourceAsStream(fileName: String) = this::class.java.getResourceAsStream(fileName).bufferedReader().readLines()

S'il trouve la ressource, il renverra un InputStream , qui peut être traité comme indiqué précédemment - par exemple, en obtenant un BufferedReader . S'il ne trouve pas la ressource, il renvoie null . Lorsque vous utilisez getResourceAsStream , le passé dans fileName est pas un nom de fichier absolu , mais un nom par rapport à nos ressources du projet.

3. Conclusion

Dans cet article, nous avons vu les différentes manières de lire un fichier dans Kotlin. Selon le cas d'utilisation, nous pouvons soit opter pour la lecture du fichier ligne par ligne, soit le lire entièrement sous forme de texte. On peut se référer au fichier de manière absolue ou le trouver parmi les ressources.

Le code source de cet article se trouve dans le référentiel GitHub suivant.