web-dev-qa-db-fra.com

Comment lire des fichiers avec Files.lines (...). ForEach (...)?

J'essaie actuellement de lire les lignes d'un fichier texte que j'ai. J'ai trouvé sur un autre stackoverflow ( Lire un fichier texte brut en Java ) que vous pouvez utiliser Files.lines (..). ForEach (..) Cependant, je ne sais pas vraiment comment utiliser le pour chaque fonction de lire ligne par ligne le texte, Quelqu'un sait où chercher ou comment le faire?

14
user3570058

Exemple de contenu de test.txt 

Hello
Stack
Over
Flow
com

Code à lire à partir de ce fichier texte en utilisant les méthodes lines() et forEach().

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

public class FileLambda {

    public static void main(String JavaLatte[]) {
        Path path = Paths.get("/root/test.txt");
        try (Stream<String> lines = Files.lines(path)) {
            lines.forEach(s -> System.out.println(s));
        } catch (IOException ex) {
          // do something or re-throw...
        }
    }
}
26
pardeep131085

Avec Java 8 , si le fichier existe dans une classpath:

Files.lines(Paths.get(ClassLoader.getSystemResource("input.txt")
                    .toURI())).forEach(System.out::println);
4
Arpit

Files.lines(Path) attend un argument Path et retourne un Stream<String>. Stream#forEach(Consumer) attend un argument Consumer. Alors invoquez la méthode en lui passant un Consumer . Cet objet devra être implémenté pour faire ce que vous voulez pour chaque ligne. 

Ceci est Java 8, vous pouvez donc utiliser des expressions lambda ou des références de méthodes pour fournir un argument Consumer.

2

Évitez de renvoyer une liste avec: 

List<String> lines = Files.readAllLines(path); //WARN

Sachez que le fichier entier est lu lorsque Files::readAllLines est appelé, le tableau de chaînes résultant stockant tout le contenu du fichier en mémoire à la fois. Par conséquent, si le fichier est très volumineux, il est possible que vous rencontriez une OutOfMemoryError qui tente de tout charger en mémoire. 

Utilisez plutôt stream: Utilisez la méthode Files.lines(Path) qui renvoie un objet Stream<String> et ne souffre pas du même problème. Le contenu du fichier est lu et traité lentement, ce qui signifie que seule une petite partie du fichier est stockée en mémoire à un moment donné.

Files.lines(path).forEach(System.out::println);
2
Imar

J'ai créé un exemple, vous pouvez utiliser le Stream pour filtrer /

public class ReadFileLines {
    public static void main(String[] args) throws IOException {
        Stream<String> lines = Files.lines(Paths.get("C:/SelfStudy/Input.txt"));
//      System.out.println(lines.filter(str -> str.contains("SELECT")).count());

//Stream gets closed once you have run the count method.
        System.out.println(lines.parallel().filter(str -> str.contains("Delete")).count());
    }
}

Exemple input.txt.

SELECT Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
1
Kumar Abhishek