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!
java nio stream bufferedreader
Commentami!