2015-08-17 36 views
18

Giả sử tôi có một java.util.stream.Stream của các đối tượng với một số toString phương pháp tốt đẹp: các ngắn nhất/giải pháp thanh lịch nhất để viết dòng này vào một tập tin, một dòng cho mỗi yếu tố dòng là gì?Java 8 dòng nộp

Để đọc, có phương pháp Files.lines đẹp, vì vậy tôi nghĩ phải có phương pháp đối xứng để ghi vào tệp nhưng không thể tìm thấy. Files.write chỉ mất một lần lặp.

+0

Tôi có thể thấy có một phương pháp ['Tệp # ghi (Đường dẫn, Lặp lại , OpenOption ...)'] (https://docs.oracle.com/javase/8/docs/api/ java/nio/file/Files.html # write-java.nio.file.Path-java.lang.Iterable-java.nio.file.OpenOption ...-) có thể giúp bạn. –

+0

Có thể tạo một FileOutputStream và sau đó tạo một PrintStream? – redxef

+0

@ downvoter: Chăm sóc để giải thích? @LuiggiMendoza: Vâng, tôi cũng đã xem và chỉnh sửa câu hỏi của mình. Đó là một trong những chỉ mất một iterable. Có, tôi có thể chuyển đổi, nhưng tôi không muốn. – knub

Trả lời

30

Có lẽ con đường ngắn nhất là sử dụng Files.write cùng với trick mà chuyển đổi Stream đến Iterable:

Files.write(Paths.get(filePath), (Iterable<String>)stream::iterator); 

Ví dụ:

Files.write(Paths.get("/tmp/numbers.txt"), 
    (Iterable<String>)IntStream.range(0, 5000).mapToObj(String::valueOf)::iterator); 

Nếu nó có vẻ quá hackish, sử dụng rõ ràng hơn cách tiếp cận:

try(PrintWriter pw = new PrintWriter(Files.newBufferedWriter(
        Paths.get("/tmp/numbers.txt")))) { 
    IntStream.range(0, 5000).mapToObj(String::valueOf).forEach(pw::println); 
} 

Nếu bạn có một số đối tượng tùy chỉnh, bạn luôn có thể thêm bước .map(Object::toString) để áp dụng phương thức toString().

+0

Vậy chính xác nó hoạt động như thế nào? Làm thế nào là một 'Iterator' cast vào một' Iterable'? – knub

+1

@knub, nó không phải là một iterator, nó là phương thức tham chiếu đến phương thức 'iterator()' (tôi không gọi phương thức 'iterator()', thay vào đó tôi tạo tham chiếu phương thức). Việc sử dụng phương pháp tham chiếu phương pháp khá bình thường, có thể được chuyển đổi thành loại giao diện chức năng. –