2017-06-14 18 views
8

Đối với tác vụ cụ thể của tôi, tôi cần đọc dữ liệu từ FileChannel đến Stream (hoặc Collection) của String.Đọc tất cả các dòng từ FileChannel đến Luồng chuỗi

Thường xuyên NIO cho số Path chúng tôi có thể sử dụng phương thức tiện lợi Files.lines(...) trả về Stream<String>. Tôi cần phải có được một kết quả tương tự, nhưng từ một FileChannel thay vì Path:

public static Stream<String> lines(final FileChannel channel) { 
//... 
} 

Bất kỳ ý tưởng làm thế nào để làm điều đó?

Trả lời

8

Tôi giả sử bạn muốn kênh được đóng lại khi trở Stream được đóng lại, vì vậy các phương pháp đơn giản nhất sẽ là

public static Stream<String> lines(FileChannel channel) { 
    BufferedReader br = new BufferedReader(Channels.newReader(channel, "UTF-8")); 
    return br.lines().onClose(() -> { 
     try { br.close(); } 
     catch (IOException ex) { throw new UncheckedIOException(ex); } 
    }); 
} 

Nó không thực sự đòi hỏi một FileChannel như đầu vào, một ReadableByteChannel là đủ.

Lưu ý rằng điều này cũng thuộc về “NIO thông thường”; java.nio.file đôi khi là referred to as “NIO.2”.

+2

oh darn, bạn vừa sửa lỗi trong cơ sở mã của chúng tôi thông qua 'onClose'. cảm ơn bạn – Eugene

Các vấn đề liên quan