Java : comment lire un fichier texte ?

Des méthodes permettent de récupérer simplement les lignes d'un fichier. Il est également possible de faire des traitements plus avancés selon les données qu'il contient.

Le langage Java contient plusieurs possibilités pour lire un fichier texte. Des méthodes permettent de récupérer simplement les lignes du fichier. Il est également possible de faire des traitements plus avancés selon les données contenues dans un fichier. Si le fichier contient des nombres, il est possible de les transférer dans un tableau d'entier.

La classe Files est utilisée dans le langage Java pour gérer les fichiers. Elle contient la méthode ReadAllLines() qui lit toutes les lignes du fichier et les transfère dans un tableau de chaîne de caractères. Si votre fichier ne contient que des entiers séparés par des espaces, il faut ensuite utiliser une expression régulière pour décomposer chaque ligne en liste de nombres. La méthode split() décompose une chaîne de caractères suivant une expression régulière. Nous allons utiliser la classe de caractères \s, qui indique un caractère d'espacement (espace, saut de ligne, tabulation) et le quantificateur +, pour indiquer qu'il peut y en avoir un ou plusieurs entre les entiers. La méthode split() retourne des chaînes de caractères. La méthode Integer.valueOf() convertit chaque chaîne en entier.

List<Integer> nombres = new ArrayList<>();
for (String ligne : Files.readAllLines(Paths.get(/chemin/vers/monFichier.txt))) {
 for (String chaine : ligne.split(\\s+))
 {
 Integer entier = Integer.valueOf(chaine);
 numbers.add(entier);
 }
}

Le langage Java 8 apporte les streams, qui permettent de transférer directement des collections d'objets d'une méthode à une autre sans les stocker en mémoire. La méthode map() va transférer le contenu sous forme de tableau à la méthode suivante. La méthode flatMap() est utilisée entre la méthode qui sépare les lignes en plusieurs chaînes et la méthode qui transforme les chaînes en entier. Avant cette méthode, nous avons un tableau (les lignes) qui contient des tableaux de chaînes (les chaînes séparées par l'expression régulière). Cette méthode va transformer ce tableau à deux dimensions en tableau à une dimension contenant toutes les chaînes à transformer en entier. Pour terminer, la méthode collect() stocke le résultat de la transformation des chaînes en entier dans la liste d'entiers.

List<Integer> nombres = Files.lines(Paths.get(/chemin/vers/monFichier.txt))
 .map(ligne -> ligne.split(\\s+)).flatMap(Arrays::stream)
 .map(Integer::valueOf)
 .collect(Collectors.toList());

Il existe une autre solution disponible à partie de Java 1.5, la classe Scanner. Elle permet de scanner le contenu d'un fichier. Il est possible de récupérer le prochain entier contenu dans le fichier avec la méthode nextInt(). En utilisant cette méthode dans une boucle et en utilisant la méthode hasNextInt() pour vérifier qu'il existe encore un entier à lire, on peut récupérer tous les nombres stockés dans le fichier.

List<Integer> entiers = new ArrayList<Integer>();
Scanner scan = new Scanner(new File(/chemin/vers/monFichier.txt));
while (scan.hasNextInt())
{
 integers.add(scan.nextInt());
}

Java