Attualmente sto provando a leggere le righe da un file di solo testo che ho. Ho trovato su un altro stackoverflow (Reading a plain text file in Java) che è possibile utilizzare Files.lines (..). ForEach (..) Tuttavia non riesco a capire come utilizzare ogni funzione per leggere testo riga per riga, tutti sanno dove cercarlo o come farlo?Come leggere da file con Files.lines (...). ForEach (...)?
risposta
Files.lines(Path)
si aspetta un argomento Path
e restituisce un Stream<String>
. Stream#forEach(Consumer)
si aspetta un argomento Consumer
. Quindi invoca il metodo, passandolo a Consumer
. Questo oggetto dovrà essere implementato per fare ciò che vuoi per ogni linea.
Questo è Java 8, quindi è possibile utilizzare espressioni lambda o riferimenti di metodo per fornire un argomento Consumer
.
contenuti Esempio di test.txt
Hello
Stack
Over
Flow
com
Codice di leggere questo file di testo utilizzando lines()
e forEach()
metodi.
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...
}
}
}
È possibile utilizzare il riferimento al metodo:' System.out :: println', ancora sarebbe tradotto nello stesso bytecode. –
E un altro punto: non si dovrebbe memorizzare 'Stream' come variabile perché potrebbe confondere alcuni lettori di usarlo due o più volte, il che è proibito. Invece, puoi salvarlo in 'List' con' readAllLines', quindi usare il metodo 'stream()' in questo elenco. –
Usa try-with-resources per lo stream per assicurarti che si chiuda automaticamente:
Con Java 8, se il file esiste in un classpath
:
Files.lines(Paths.get(ClassLoader.getSystemResource("input.txt")
.toURI())).forEach(System.out::println);
ho creato un campione, è possibile utilizzare il flusso di filtrare input/
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());
}
}
Campione .testo.
SELECT Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Tale metodo è già leggendo ogni riga del file, è possibile memorizzare la linea in una variabile 'STRING' e fare qualcosa di diverso con esso ... –
Uhm, si dovrebbe leggere su Java 8 e lambda; in particolare qui, su 'Consumer' e la nozione di singolo metodo astratto – fge