Home / Programmazione / Java / Leggere file in Java con gli Stream
Mattepuffo

Leggere file in Java con gli Stream

Leggere file in Java con gli Stream

Oggi vediamo come leggere un file riga per riga in Java usando gli Stream.

Quindi parliamo di Java 8.

Vedremo tre metodi:

  • soloStream che usa l'interfaccia Stream in maniera "secca"
  • bufferStream che usa Stream con BufferedReader
  • streamExtra, simile al primo ma con alcune funzionalità in più

In più vi dico che, in tutti e tre i metodi, useremo il package java.nio.

Il file che leggeremo sarà così composto:

linea 1
linea 2
riga 3
riga 4
row 5
linea 6

Vediamo il codice:

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;
import java.util.stream.Stream;

public class Main {

    private String file = "test.txt";

    public static void main(String[] args) {
        Main m = new Main();
        System.out.println("SOLO STREAM");
        m.soloStream();
        System.out.println("BUFFER + STREAM");
        m.bufferStream();
        System.out.println("STREAM CON EXTRA");
        m.streamExtra();
    }

    public void soloStream() {
        try (Stream stream = Files.lines(Paths.get(file))) {
            stream.forEach(System.out::println);
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }

    public void bufferStream() {
        List list = new ArrayList<>();
        try (BufferedReader buff = Files.newBufferedReader(Paths.get(file))) {
            list = buff.lines().collect(Collectors.toList());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
        list.forEach(System.out::println);
    }

    public void streamExtra() {
        List list = new ArrayList<>();
        try (Stream stream = Files.lines(Paths.get(file))) {
            list = stream.filter(line -> line.startsWith("row")).map(String::toUpperCase).collect(Collectors.toList());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
        list.forEach(System.out::println);
    }
}

Il primo e il secondo metodo daranno lo stesso identico output.

Il terzo metodo, invece, resituirà solo una riga; questo avviene in quanto usiamo il metodo filter, indicando come deve cominciare la linea (startsWith).

Se volessimo fare il contrario, cioè escludere quella linea, dovremmo cambiare il codice così:

list = stream.filter(line -> !line.startsWith("row")).map(String::toUpperCase).collect(Collectors.toList());

Un semplice punto esclamativo.

Enjoy!