In Java 8, you can use Files.lines to read file as Stream.

c://lines.txt – A simple text file for testing

line1
line2
line3
line4
line5

1. Java 8 Read File + Stream

TestReadFile.java

package com.favtuts.java8.stream;

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

public class StreamReadFileLines {

    public static void main(String[] args) {
        useFileLinesMethodWithStream();
    }

    static void useFileLinesMethodWithStream() {
        String fileName = "/home/tvt/workspace/favtuts/lines.txt";

        // read file into stream, try-with-resources
        try (Stream<String> stream = Files.lines(Paths.get(fileName))) {

            stream.forEach(System.out::println);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Output

line1
line2
line3
line4
line5

2. Java 8 Read File + Stream + Extra

This example shows you how to use Stream to filter content, convert the entire content to upper case and return it as a List.

TestReadFile2.java

package com.favtuts.java8.stream;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamReadFileLines {

    public static void main(String[] args) {     
        readFileLinesWithFilterExtra();
    }

    static void readFileLinesWithFilterExtra() {
        String fileName = "/home/tvt/workspace/favtuts/lines.txt";
        List<String> list = new ArrayList<>();

        try (Stream<String> stream = Files.lines(Paths.get(fileName))) {

            // 1. filter line 3
            // 2. convert all content to upper case
            // 3. convert it into a List
            list = stream
                    .filter(line -> !line.startsWith("line3"))
                    .map(String::toUpperCase)
                    .collect(Collectors.toList());

        } catch (IOException e) {
            e.printStackTrace();
        }

        list.forEach(System.out::println);
    }
}

Output

LINE1
LINE2
LINE4
LINE5

3. BufferedReader + Stream

A new method lines() has been added since 1.8, it lets BufferedReader returns content as Stream.

TestReadFile3.java

package com.favtuts.java8.stream;

import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class StreamReadFileLines {

    public static void main(String[] args) {
        readFileLinesWithBufferedReader();
    }

    static void readFileLinesWithBufferedReader() {
        String fileName = "/home/tvt/workspace/favtuts/lines.txt";
        List<String> list = new ArrayList<>();

        try (BufferedReader br = Files.newBufferedReader(Paths.get(fileName))) {

            // br returns as stream and convert it into a List
            list = br.lines().collect(Collectors.toList());

        } catch (IOException e) {
            e.printStackTrace();
        }

        list.forEach(System.out::println);
    }

}

Output

line1
line2
line3
line4
line5

4. Classic BufferedReader And Scanner

Enough of Java 8 and Stream, let revisit the classic BufferedReader (JDK1.1) and Scanner (JDK1.5) examples to read a file line by line, it is working still, just developers are moving toward Stream.

4.1 BufferedReader + try-with-resources example.

TestReadFile4.java

package com.favtuts.java8.stream;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class StreamReadFileLines {

    public static void main(String[] args) {       
        readFileLinesBufferedReaderClassic();
    }

    static void readFileLinesBufferedReaderClassic() {
        String fileName = "/home/tvt/workspace/favtuts/lines.txt";

        try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {

            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4.2 Scanner + try-with-resources example.

TestReadFile5.java

package com.favtuts.java8.stream;

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class StreamReadFileLines {

    public static void main(String[] args) {       
        readFileLinesWithScanner();
    }

    static void readFileLinesWithScanner() {
        String fileName = "/home/tvt/workspace/favtuts/lines.txt";

        try (Scanner scanner = new Scanner(new File(fileName))) {

            while (scanner.hasNext()) {
                System.out.println(scanner.nextLine());
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Download Source Code

$ git clone https://github.com/favtuts/java-core-tutorials-examples

$ cd java-basic/java8/stream

References

  1. Java 8 File.lines()
  2. Java 8 Stream
  3. Java BufferedReader

Leave a Reply

Your email address will not be published. Required fields are marked *