2014-04-24 11 views
11

Tôi hiện đang cố gắng đọc các dòng từ một tệp chỉ có văn bản mà tôi có. Tôi tìm thấy trên stackoverflow khác (Reading a plain text file in Java) mà bạn có thể sử dụng Files.lines (..). ForEach (..) Tuy nhiên tôi không thể thực sự tìm ra cách sử dụng cho từng chức năng để đọc từng dòng văn bản, Bất cứ ai biết nơi để tìm kiếm hoặc làm thế nào để làm như vậy?Cách đọc từ tập tin với Files.lines (...). ForEach (...)?

+0

Đó phương pháp đã được đọc mỗi dòng của tập tin, bạn có thể lưu trữ các dòng trong một biến 'chuỗi' và làm điều gì đó khác với nó ... –

+0

Uhm, bạn nên đọc về Java 8 và lambdas; cụ thể ở đây, về 'Consumer' và khái niệm về phương thức trừu tượng đơn lẻ – fge

Trả lời

1

Files.lines(Path) mong đợi đối số Path và trả về một Stream<String>. Stream#forEach(Consumer) mong đợi đối số Consumer. Vì vậy, hãy gọi phương thức, chuyển nó qua một số Consumer. Đối tượng đó sẽ phải được thực hiện để làm những gì bạn muốn cho mỗi dòng.

Đây là Java 8, vì vậy bạn có thể sử dụng biểu thức lambda hoặc tham chiếu phương thức để cung cấp đối số Consumer.

23

nội dung mẫu của test.txt

Hello 
Stack 
Over 
Flow 
com 

Mã để đọc từ tập tin văn bản này sử dụng lines()forEach() phương pháp.

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

Bạn có thể sử dụng tham chiếu phương thức:' System.out :: println', nó vẫn được dịch sang cùng bytecode. –

+1

Và một điểm nữa: bạn không nên lưu trữ 'Stream' là biến vì nó có thể gây nhầm lẫn cho một số độc giả sử dụng nó hai lần hoặc nhiều hơn, điều đó bị cấm. Thay vào đó, bạn có thể lưu nó vào 'List' với' readAllLines', sau đó sử dụng phương thức 'stream()' trên danh sách này. –

+8

Sử dụng try-with-resources cho luồng để đảm bảo luồng được tự động đóng: 'try (Stream lines = Files.lines (đường dẫn)) {' – odoepner

1

Với Java 8, nếu tập tin tồn tại trong một classpath:

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

tôi đã tạo ra một mẫu, bạn có thể sử dụng Stream để lọc đầu vào/

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

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