How to read from files with Files.lines(...).forEach(...)?
Asked Answered
G

5

22

I'm currently trying to read lines from a text only file that I have. I found on another stackoverflow(Reading a plain text file in Java) that you can use Files.lines(..).forEach(..) However I can't actually figure out how to use the for each function to read line by line text, Anyone know where to look for that or how to do so?

Greaseball answered 24/4, 2014 at 17:59 Comment(2)
That method is already reading each line of the file, you can store the line in a String variable and do something else with it...Sugihara
Uhm, you should read about Java 8 and lambdas; specifically here, about Consumer and the notion of single abstract methodCole
C
38

Sample content of test.txt

Hello
Stack
Over
Flow
com

Code to read from this text file using lines() and forEach() methods.

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 args[]) {
        Path path = Paths.of("/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...
        }
    }
    
}
Carrillo answered 25/4, 2014 at 9:24 Comment(7)
You may use method reference: System.out::println, still it would be translated to the same bytecode.Ordonez
And one more point: you should not store Stream as variable because it may confuse some readers to use it twice or more times, which is prohibited. Instead, you may save it to List with readAllLines, then use method stream() on this list.Ordonez
Use try-with-resources for the stream to ensure it gets auto-closed: try (Stream<String> lines = Files.lines(path)) {Rutaceous
@DmitryGinzburg Would you store the Stream as a variable for files too big for readAllLines?Carrara
@Carrara why should I? I can use Files.lines result immediately.Ordonez
@DmitryGinzburg I got this confused with a try-with-resources answer on a different page. Sorry for bothering you.Carrara
I'm getting "java.nio.file.NoSuchFileException" even though executing file and txt file both are in the same folder and I'm putting address as filename.Shellacking
B
11

Avoid returning a list with:

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

Be aware that the entire file is read when Files::readAllLines is called, with the resulting String array storing all of the contents of the file in memory at once. Therefore, if the file is significantly large, you may encounter an OutOfMemoryError trying to load all of it into memory.

Use stream instead: Use Files.lines(Path) method that returns a Stream<String> object and does not suffer from this same issue. The contents of the file are read and processed lazily, which means that only a small portion of the file is stored in memory at any given time.

Files.lines(path).forEach(System.out::println);
Bang answered 26/9, 2018 at 14:54 Comment(2)
I have a doubt here. Will the Files.lines() return stream of each line or will it return a stream out of the whole file? Please clarify.Marxmarxian
"Read all lines from a file as a Stream." docs.oracle.com/javase/8/docs/api/java/nio/file/…Mcconnell
A
6

With Java 8, if file exists in a classpath:

Files.lines(Paths.get(ClassLoader.getSystemResource("input.txt")
                    .toURI())).forEach(System.out::println);
Aniseikonia answered 17/11, 2015 at 6:25 Comment(0)
S
3

Files.lines(Path) expects a Path argument and returns a Stream<String>. Stream#forEach(Consumer) expects a Consumer argument. So invoke the method, passing it a Consumer. That object will have to be implemented to do what you want for each line.

This is Java 8, so you can use lambda expressions or method references to provide a Consumer argument.

Stockman answered 24/4, 2014 at 18:12 Comment(0)
S
2

I have created a sample , you can use the Stream to filter/

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());
    }
}

Sample input.txt.

SELECT Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Spermary answered 11/4, 2016 at 7:48 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.