2014-04-24 9 views
11

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 (...)?

+0

Tale metodo è già leggendo ogni riga del file, è possibile memorizzare la linea in una variabile 'STRING' e fare qualcosa di diverso con esso ... –

+0

Uhm, si dovrebbe leggere su Java 8 e lambda; in particolare qui, su 'Consumer' e la nozione di singolo metodo astratto – fge

risposta

1

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.

23

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... 
     } 
    } 
} 
+3

È possibile utilizzare il riferimento al metodo:' System.out :: println', ancora sarebbe tradotto nello stesso bytecode. –

+1

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. –

+8

Usa try-with-resources per lo stream per assicurarti che si chiuda automaticamente: righe = Files.lines (percorso)) { – odoepner

1

Con Java 8, se il file esiste in un classpath:

Files.lines(Paths.get(ClassLoader.getSystemResource("input.txt") 
        .toURI())).forEach(System.out::println); 
1

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