2014-04-24 11 views
11

Obecnie próbuję odczytać linie z pliku tekstowego, który mam. Znalazłem na innym stackoverflow (Reading a plain text file in Java), że można użyć Files.lines (..). ForEach (..) Jednak nie mogę faktycznie dowiedzieć się, jak korzystać z każdej funkcji, aby przeczytać tekst po linii, Każdy wie gdzie szukać i jak to zrobić?Jak czytać z plików z Files.lines (...). ForEach (...)?

+0

Metoda ta jest już czyta każdy wiersz pliku, można przechowywać wiersz w zmiennej 'String' i zrobić coś innego z nim ... –

+0

Uhm, należy przeczytać o Java 8 i lambdas; konkretnie tutaj, o 'Consumer' i pojęciu pojedynczej abstrakcyjnej metody. – fge

Odpowiedz

1

Files.lines(Path) oczekuje argumentu Path i zwraca wartość Stream<String>. Stream#forEach(Consumer) oczekuje argumentu Consumer. Więc wywołaj metodę, podając ją jako Consumer. Ten obiekt będzie musiał zostać zaimplementowany, aby zrobić to, co chcesz dla każdej linii.

To jest Java 8, więc możesz użyć wyrażeń lambda lub odwołań do metod, aby podać argument Consumer.

23

zawartość Przykładowy Test.txt

Hello 
Stack 
Over 
Flow 
com 

kod do odczytu z tego pliku tekstowego przy użyciu lines() i forEach() metod.

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

Możesz użyć odwołania do metody:' System.out :: println', nadal byłoby to przetłumaczone na ten sam kod bajtowy. –

+1

I jeszcze jeden punkt: nie powinieneś zapisywać 'Stream' jako zmiennej, ponieważ może to wprowadzać w błąd niektórych czytelników, którzy używają go dwukrotnie lub więcej razy, co jest zabronione. Zamiast tego możesz zapisać go do 'List' za pomocą' readAllLines', a następnie użyć metody 'stream()' na tej liście. –

+8

Użyj try-for-resources dla strumienia, aby zapewnić automatyczne zamknięcie: 'try (Stream lines = Files.lines (ścieżka)) {' – odoepner

1

Z Java 8, jeśli plik istnieje w classpath:

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

Stworzyłem próbkę, można użyć Stream filtrować wejście/

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()); 
    } 
} 

Sample .tekst.

SELECT Every thing 
Delete Every thing 
Delete Every thing 
Delete Every thing 
Delete Every thing 
Delete Every thing 
Delete Every thing