web-dev-qa-db-fra.com

Comment lire un fichier ligne par ligne avec Java Stream

J'essaie de lire un long fichier ligne par ligne et en même temps d'extraire des informations de la ligne.

Voici un exemple de ce que je fais:

import Java.io.File;
import Java.io.IOException;
import Java.nio.file.Files;
import Java.util.stream.Stream;

public class ReadFile_Files_Lines {

    public static void main(String[] pArgs) throws IOException {
        String fileName = "c:\\temp\\sample-1GB.txt";
        File file = new File(fileName);

        try (Stream<String> linesStream = Files.lines(file.toPath())) {
            linesStream.forEach(line -> {
                System.out.println(line);
            });
        }
    }
}

Une ligne de mon dossier est divisée en trois parties:

10 1010101 15

Je cherche à lire ces trois informations à chaque fois .

String str1 = line[0];
String str2 = line[1];
String str3 = line[2];

La solution que je recherche sera meilleure si je ne convertis pas le flux en une collection ..__ Je vais utiliser ces 3 chaînes pour créer une structure de données graphique, quelque chose comme: 

createGraphe(str1,str2,str3);`

Je sais que je peux envoyer la chaîne complète, mais comme je suis en train d'apprendre Stream, je suis curieux de savoir comment extraire ces informations.

Je vous remercie.

4
zak zak

Vous pouvez mapper un tableau en scindant chaque ligne, puis appelez la méthode de votre choix.

Files.lines(filePath)
    .map(l -> l.split(" "))
    .forEach(a -> createGraphe(a[0], a[1], a[2]));
6
daniu

La méthode lines() que vous utilisez fait déjà ce que vous attendez de lui.

Java 8 a ajouté une nouvelle méthode appelée lines() dans la classe Files qui peut être utilisée pour lire un fichier ligne par ligne en Java. La beauté de cette méthode est qu’elle lit toutes les lignes d’un fichier en tant que Stream of String, qui est rempli paresseusement au fur et à mesure que le flux est consommé. Ainsi, si vous avez un fichier volumineux et que vous ne lisez que les 100 premières lignes, le reste des lignes ne sera pas chargé en mémoire, ce qui donnera de meilleures performances.

Ceci est légèrement différent de la méthode Files.readAllLines() (qui lit toutes les lignes d'une liste), car cette méthode lit le fichier paresseusement, uniquement lorsqu'une opération de terminal est appelée sur Stream, par exemple. forEach(), count() etc. En utilisant la méthode count(), vous pouvez réellement compter un nombre de lignes dans les fichiers ou un nombre de lignes vides en filtrant les lignes vides.

Référence: https://javarevisited.blogspot.com/2015/07/3-ways-to-read-file-line-by-line-in.html

Puisque vous voulez résoudre ce problème et que vous voulez savoir comment les flux peuvent être utiles dans cette situation

  1. En lisant un fichier (avec Java8), toutes les lignes du fichier seront récupérées : Stream lines = Files.lines (Paths.get (filePath))
  2. Lecture de ce fichier ligne par ligne : lines.map (line -> line.split (pattern)), en scindant la ligne pour obtenir trois sections.
  3. Passage des arguments obtenus dans la fonction n: forEach (arg -> createGraphe (arg [0], arg [1], arg [2]);

J'espère que c'est assez élaboré pour votre réponse si vous voulez atteindre cet objectif

0
Anshul